我的表格中有一个“订单”列,我希望它最初设置为等于记录的ID。
我可以在迁移中执行此操作,还是需要在创建操作中设置它?
答案 0 :(得分:3)
如果您已有数据,则无法在创建回调操作中执行此操作,因为这些项已经创建。但是,创建回调可以帮助您创建新对象:
after_create :set_order_attribute
def set_order_attribute
self.update_columns(order: id) if order.nil?
end
您可以在技术上将迁移中的现有数据更新为SQL语句,但我不建议使用涉及ActiveRecord模型的命令,因为随着模型的更改,迁移可能会在某些时候中断。要在迁移中执行此操作,您将在:up方法中使用执行命令(不确定您想要的行为:向下),如下所示:
def up
table_name = "foo"
execute "UPDATE #{table_name} SET order = id;"
end
或者,您可以创建单独的rake任务来执行更新;这样可以使您的迁移更加清晰,并让您更好地控制何时运行更新任务。
答案 1 :(得分:0)
我认为传递给的值:迁移中的默认值不能是变量。我会尝试这样的回调:
before_save :initialize_order
def initialize_order
self.order = self.id
end