如何默认创建has_one关系中对象的实例

时间:2012-09-13 17:17:11

标签: ruby-on-rails activerecord

是否存在用于在AR关系中创建对象的DSL,该对象与:dependent => destroy相反(换句话说,创建对象以使其始终存在)。比方说,我有以下内容:

class Item < ActiveRecord::Base
  #price
  has_one :price, :as => :pricable, :dependent => :destroy
  accepts_nested_attributes_for :price
  ....

class Price < ActiveRecord::Base
    belongs_to :pricable, :polymorphic => true
    attr_accessible :price, :price_comment

我在想,即使我们没有指定价格,我也希望每次都能创造价格?是唯一(或最好)选项,作为回调执行此操作还是有办法通过DSL(类似于:denpendent => :destroy)执行此操作?

2 个答案:

答案 0 :(得分:0)

不,因为几乎没有用例。如果你的记录在没有相关记录的情况下不能存在,你可能应该阻止保存记录,而不是在某种伪空对象中使用它来取代它。

最接近的近似值是before_save回调:

class Item < ActiveRecord::Base
  has_one :price, :as => :pricable, :dependent => :destroy
  accepts_nested_attributes_for :price

  before_save :create_default_price

  def create_default_price
    self.price ||= create_price
  end

end

答案 1 :(得分:0)

您应该只在创建时运行此代码一次,并在此处使用便捷方法create_price

class Item < ActiveRecord::Base
  has_one :price, :as => :pricable, :dependent => :destroy

  accepts_nested_attributes_for :price

  after_validation :create_default_price, :on => :create

  def create_default_price
    self.create_price
  end
end