Ruby on rails 如何复制其他列';s值作为rails迁移中新列的默认值?

Ruby on rails 如何复制其他列';s值作为rails迁移中新列的默认值?,ruby-on-rails,activerecord,migration,Ruby On Rails,Activerecord,Migration,我有一个型号,上面有一列价格。我需要添加一个新的\u列标记的\u price,其值为price,作为默认值。我可以在迁移中写这篇文章吗,或者最好的方法是什么 比如: class AddMarkedPriceToMenuItems < ActiveRecord::Migration def change add_column :menu_items, :marked_price, :decimal, :default => :price end end class A

我有一个型号,上面有一列
价格
。我需要添加一个新的\u列
标记的\u price
,其值为
price
,作为默认值。我可以在迁移中写这篇文章吗,或者最好的方法是什么

比如:

class AddMarkedPriceToMenuItems < ActiveRecord::Migration
  def change
    add_column :menu_items, :marked_price, :decimal, :default => :price
  end
end
class AddMarkedPriceToNuItems:价格
结束
结束

否,数据库不允许您使用表列上的
默认设置来执行此操作

但是您可以使用ActiveRecord回调来完成


请注意,您可能希望创建位于迁移中本地的模型副本,以便将来不会失去同步。

这是一种通用的解决方法,无需编写查询,因为查询会面临风险

class Demo < ActiveRecord::Migration
  def change
    add_column :events, :time_zone, :string
    Test.all.each do |p|
      p.update_attributes(time_zone: p.check.last.time_zone)
    end
    remove_column :sessions, :time_zone
  end
end
类演示
我想你把“价格”和“标价”搞错了。此语法
MenuItem.update\u all(price::market\u price)
不起作用(至少在ActiveRecord 4.2.7.1上是这样),应该是
MenuItem.update\u all(“marked\u price=price”)
此外,
update\u all
只需要在向上(而不是向下)迁移时执行。它可以被包装在一个
可逆的
块@wizadofogz中,你说得对。我已经更新了我的答案。谢谢。在迁移中引用模型类是一种不好的做法,因为迁移可能会在模型类更改/删除后执行。@JeffTsay我不太理解您的顾虑。当然,迁移至少要引用一个模型类,即应用迁移的模型类,那么为什么在同一迁移中以另一种方式引用它会很危险呢?如果迁移是在删除模型类之后应用的,那么问题肯定不在于迁移本身,而在于它的执行顺序不正确?
def change
  add_column :menu_items, :marked_price, :decimal

  reversible do |dir|
    dir.up { MenuItem.update_all('marked_price = price') }
  end
end
class Demo < ActiveRecord::Migration
  def change
    add_column :events, :time_zone, :string
    Test.all.each do |p|
      p.update_attributes(time_zone: p.check.last.time_zone)
    end
    remove_column :sessions, :time_zone
  end
end