Rails:将默认值设置为与记录ID相同

时间:2012-01-12 03:52:11

标签: ruby-on-rails

我的表格中有一个“订单”列,我希望它最初设置为等于记录的ID。

我可以在迁移中执行此操作,还是需要在创建操作中设置它?

2 个答案:

答案 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