繁体   English   中英

ActiveRecord 未使用.build 在 has_many 关联上设置外键

[英]ActiveRecord not setting foreign key on has_many association using .build

我有一个具有以下(简化)模型的 Rails 应用程序:

# member.rb
class Member < ActiveRecord::Base
  has_many :member_roles, :dependent => :destroy, 
           :autosave => true, :inverse_of => :member
end

...

# member_role.rb
class MemberRole < ActiveRecord::Base
  belongs_to :member, :inverse_of => :member_roles
  validates_presence_of :member_id
end

如果我尝试在关联上使用.build方法,创建的 object 没有设置外键。 这会导致它无法通过验证,或者未经验证就无法与Member关联。

# Rails console
> m = Member.find(280)
> mr = m.member_roles.build(:role_id => Role.find_by_name("Crew Chief").id)
=> #<MemberRole id: nil, member_id: nil, role_id: 6697350, start_date: nil, \
   end_date: nil, memo: nil, created_at: nil, updated_at: nil>
> mr.save!
ActiveRecord::RecordInvalid: Validation failed: Member can't be blank
> mr.save(:validate => false)
> mr
=> #<MemberRole id: 1834, member_id: nil, role_id: 6697350, start_date: nil, \
   end_date: nil, memo: nil, created_at: "2012-04-11 06:37:00", \
   updated_at: "2012-04-11 06:37:00">

这与Rails 指南冲突:

collection.build 方法返回一个或多个关联类型的新对象。 这些对象将从传递的属性中实例化,并通过它们的外键创建链接,但关联的对象还不会被保存。

显然,手动设置 member_id 很容易解决。 但我想避免这种情况。 我相信这段代码在以前的 rails 版本中工作正常;以上是 Rails 3.2.3 的行为。

我将 grosser 的回答中的代码作为初始值设定项: Can nested attributes be used in combination with inheritance?

将其更改为:

class ActiveRecord::Reflection::AssociationReflection
  def build_association(*options, &block)
    if options.first.is_a?(Hash) and options.first[:type].presence
      options.first[:type].to_s.constantize.new(*options, &block)
    else
      klass.new(*options, &block)
    end
  end
end

解决了问题。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM