One of the purpose of rails migration script was to wrap SQL with simple ruby code. But still we need some SQL for creating foreign key or inserting some default data or updating some existing data. There is a rails plugin to solve this problem.migration_helpers provides some basic helpers for writing migration scripts.
It wraps
- Add/remove foreign key
- Insert statements
- update statements
Here is a sample migration that uses insert and update statement.
class CreatePosts < ActiveRecord::Migration
def self.up
create_table :posts do |t|
t.string :title
t.text :body
t.boolean :published
t.timestamps
end
insert_row('posts', :title => 'Dummy Title', :body => 'A sample post', :published => false)
update_row('posts', :set => { :published => true }, :where => { :title => 'Dummy Title' })
end
def self.down
drop_table :posts
end
endAnd here is a sample migration that uses foreign key reference.class CreateComments < ActiveRecord::Migration<br /> def self.up<br /> create_table :comments do |t|<br /> t.text :body<br /> t.boolean :published<br /> t.references :post<br /> <br /> t.timestamps<br /> end<br /> <br /> add_foreign_key('comments', 'post_id', 'posts')<br /> end<br /> <br /> def self.down<br /> remove_foreign_key('comments', 'posts')<br /> drop_table :comments<br /> end<br />endCaution:
This is really a nice plugin but I needed to modify some code to work remove_foreign_key.
In plugins/migration_helpers/lib/migration_helpers_tasks.rb file replace the remove_foreign_key with the following code
def remove_foreign_key(table, target_table, constraint_name="#{table.to_s}_#{target_table.to_s}_fkey")<br /> execute "ALTER TABLE #{table.to_s} DROP FOREIGN KEY #{constraint_name};"<br /> execute "ALTER TABLE #{table.to_s} DROP KEY #{constraint_name};"<br />endReference:
http://github.com/patientslikeme/migration_helpers/tree/master
No comments:
Post a Comment