如何在ruby-on-rails中使用create_association

时间:2013-05-20 22:37:50

标签: ruby-on-rails-3 activerecord

我无法将create_association(attributes = {})方法用于Rails中的关联模型。

class Gwgiftwhip < ActiveRecord::Base
  has_one :gift, :autosave => true, :dependent => :destroy
  validates :gift, :presence => true  
end

class Gift < ActiveRecord::Base
  belongs_to :gwgiftwhip
end

belongs_to section in the Active Record Associations Guide建议您应该能够使用以下方法:create_association(attributes = {})来创建相关模型,并在使用belongs_to关联时保存它。但是,由于相关的模型参数“gift”未被设置,以下实现会导致保存错误。

class GiftsController < ApplicationController
...
def inbound
  @gift = Gift.new(params.slice(*Gift.new.acceptable))    
  if @gift.create_gwgiftwhip({:user_id => @gift.user_id}, :without_protection => true)
    ...
  end
end

以下作品,但似乎超出了预期用途。它正在创建一个相关模型,然后将自己设置为相关模型。这需要另一步然后保存。

class GiftsController < ApplicationController
...
def inbound
  @gift = Gift.new(params.slice(*Gift.new.acceptable))    
  @gift.create_gwgiftwhip({:user_id => @gift.user_id}, :without_protection => true).gift = @gift
  if @gift.gwgiftwhip.save
    ...
  end
end

1 个答案:

答案 0 :(得分:1)

尝试转身:

def inbound
  @gift = Gift.new( params.slice( *Gift.new.acceptable ) )    
  if Gwgiftwhip.create( {user_id: @gift.user_id, 
                            gift: @gift}, without_protection: true )
    ...
  end
end

您可能还会考虑在Gwgif Whip上覆盖gift=,以便自动设置gift设置user_id。例如:

class Gwgiftwhip
  has_one :gift, :autosave => true, :dependent => :destroy

  def gift=( gift )
    super( gift )
    self.user_id = gift.user_id
  end
end