After mostly doing RoR work for the last several months, lately I've had to write a few command line scripts that interact with MySQL.
I came across an article by Steve Litt on Troubleshooters.com, which I found useful for comparing the mysql driver, dbi, and ActiveRecord:
Ruby Database Connectivity
And here a few articles by Paul DuBois on Ruby and database connectivity:
Using the Ruby MySQL Module
Using the Ruby DBI Module
Ruby, Ruby on Rails
Showing posts with label ruby mysql. Show all posts
Showing posts with label ruby mysql. Show all posts
Tuesday, December 11, 2007
Ruby on Rails - Legacy MySQL Database
I'm rewriting a company admin tool written in mod_perl (Catalyst) and replacing it with a new one using Ruby on Rails. At the moment, I have to keep the legacy database/schema. Most of the old tables don't use auto-incrementing keys, which means I won't get the Rails Active::Record magic and I need to work around the keys.
Here's an example table:
mysql> describe clients;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| client_abbrv | varchar(5) | NO | PRI | | |
| client_name | varchar(50) | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
To get this to work with Rails, I had to make a few small changes.
I made one small change in the view, which was setting the name of the primary key field. I changed "client_abbrv" to "id" in the form:
app/views/client/new.rhtml
For the model, I had set the primary key with
app/models/clients.rb
Luckily, the table was already pluralized. If it had been "client," then I would have had to add this line:
For the controller, I had to change the create method:
app/controllers/client_controller.rb
That replaced the old create method where I had the normal:
When using
Here's what the controller is doing for the create method:
Here's an example table:
mysql> describe clients;
+--------------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+--------------+-------------+------+-----+---------+-------+
| client_abbrv | varchar(5) | NO | PRI | | |
| client_name | varchar(50) | YES | | NULL | |
+--------------+-------------+------+-----+---------+-------+
To get this to work with Rails, I had to make a few small changes.
I made one small change in the view, which was setting the name of the primary key field. I changed "client_abbrv" to "id" in the form:
app/views/client/new.rhtml
<%= error_messages_for 'client' %>
<fieldset>
<legend>Add a Client
<% form_tag :action => "create" do %>
<p>
<label for="client_client_name">Client Name:
<%= text_field 'client', 'client_name' %>
</p>
<p>
<label for="client_id">Client Abbrv:
<%= text_field 'client', 'id' %>
</p>
<p>
<%= submit_tag 'Add' %>
</p>
<% end %>
</fieldset>
For the model, I had set the primary key with
set_primary_key
.app/models/clients.rb
class Client < ActiveRecord::Base
set_primary_key "client_abbrv"
end
Luckily, the table was already pluralized. If it had been "client," then I would have had to add this line:
def self.table_name() "client" end
For the controller, I had to change the create method:
app/controllers/client_controller.rb
def create
@client = Client.new
@client.id = params[:client][:id]
@client.client_name = params[:client][:client_name]
if @client.save
flash[:notice] = "Client was successfully created."
redirect_to :action => 'list'
else
render :action => 'new'
end
end
That replaced the old create method where I had the normal:
@client = Client.new(params[:client])
When using
set_primary_key
, you insert data using "id" and typically select data using the actual field name, "client_abbrv" in this case.Here's what the controller is doing for the create method:
dsparling-imbps-computer:~/my/rubydev/uclick-admin dsparlingimbp$ script/console
Loading development environment.
>> client = Client.new
=> #<Client:0x32b5e14 @new_record=true, @attributes={"client_name"=>nil}>
>> client.id = "abc"
=> "abc"
>> client.client_name = "ABC Company"
=> "ABC Company"
>> client.valid?
=> true
>> client.save
=> true
Subscribe to:
Posts (Atom)
About Me

- Doug Sparling
- Developer (Ruby on Rails, iOS), musician/composer, Buddhist, HSP, Vegan, Aspie.