我们平时做Migrations时除了更改schema,还经常需要更改data
但我们以前的Migrations可能不工作,因为data之间可能有依赖关系
我们可以通过在Migrations里定义Model来解决该问题:
[code]
class AddPositionToProducts < ActiveRecord::Migration
class Product < ActiveRecord::Base; end
class SoftwareProduct < Product; end
class CourseProduct < Product; end
def self.up
add_column :products, :position, :integer
Product.reset_column_information
SoftwareProduct.find(:all).inject(0) do |i, p|
p.update_attribute(:position, i)
i+1
end
CourseProduct.find(:all).inject(0) do |i, p|
p.update_attribute(:position, i)
i+1
end
end
def self.down
remove_column :products, :position
end
end
[/code]
这里我们在Migration里面定义Model,相当于给Model加了一个名字空间AddPositionToProducts::Product,这就能保证该Model在你的migrations里是唯一的
但我们以前的Migrations可能不工作,因为data之间可能有依赖关系
我们可以通过在Migrations里定义Model来解决该问题:
[code]
class AddPositionToProducts < ActiveRecord::Migration
class Product < ActiveRecord::Base; end
class SoftwareProduct < Product; end
class CourseProduct < Product; end
def self.up
add_column :products, :position, :integer
Product.reset_column_information
SoftwareProduct.find(:all).inject(0) do |i, p|
p.update_attribute(:position, i)
i+1
end
CourseProduct.find(:all).inject(0) do |i, p|
p.update_attribute(:position, i)
i+1
end
end
def self.down
remove_column :products, :position
end
end
[/code]
这里我们在Migration里面定义Model,相当于给Model加了一个名字空间AddPositionToProducts::Product,这就能保证该Model在你的migrations里是唯一的