Ruby on rails 3 如何在RubyonRails中使用create_关联

Ruby on rails 3 如何在RubyonRails中使用create_关联,ruby-on-rails-3,activerecord,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 bel

我在让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
gwgifthip类true,:dependent=>:destroy
验证:gift,:presence=>true
结束
类礼品
建议您应该能够使用以下方法:create_association(attributes={})来创建相关模型,并在使用belish_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 giftcontroller@gift.user_id},:without_protection=>true)
...
结束
结束
下面的代码可以工作,但似乎超出了预期用途。它创建一个相关模型,然后将自身设置为相关模型。这需要另一个步骤来保存

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
class giftcontroller@gift.user_id},:without_protection=>true)。gift=@gift
如果@gift.gwgifthip.save
...
结束
结束
试着扭转局面:

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
您还可以在GWGIFTHIP上覆盖
gift=
,以便设置
gift
自动设置
user\u id
。例如:

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

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

谢谢看起来.create()将返回新对象,而不管验证是否通过,所以实际上添加(不是)新的\u记录?这是一种让它发挥作用的方法
!GWGIFTHIP.create({:user\u id=>@gift.user\u id,:gift=>@gift},:without\u protection=>true)。新建\u记录?
另外,关于覆盖相关模型的setter方法的建议非常好。它工作得非常好。对于每一个其他用例,用户id必须是当前用户,因此我可能会在其他地方使用您的建议。