如何根据 Rails 中的关联模型设置默认值?

How do I set a default value based on an associated model in Rails?

我有一个名为 userWorkshop 的模型,它同时引用了 UserWorkshop

Workshops 有一个 价格 列。

userWorkshops 有一个 override_price 列。

我希望 UserWorkShopoverride_price 列的默认值基于 价格 它关联的 Workshop 列。

我想在我的 ActiveRecord 迁移中设置这个值。我想它可能看起来像这样:

  def change
    add_column :userWorkshops, :override_price, :float, default: "self.workshop.price" 
  end

知道正确的方法吗?

我不确定是否有办法在一次迁移中完成所有这些。我会利用 before_initialize 回调。

class UserWorkshop < ApplicationRecord
  has_many :users
  belongs_to :workshop

  before_initialize :initial_values, unless: persisted?

  def initial_values
    self.override_price = workshop.price
  end
end

这样做的好处是,您可以轻松地将 override_price 更改为这样的 self.override_price = workshop.price/2,从而为他们提供 50% 的折扣或类似的任何其他优惠。

然后在迁移中,处理旧数据。

def change
  UserWorkshop.find_each do |uw|
    uw.override_price = uw.workshop.price
    uw.save
  end
end