0

乍一看,这似乎是一个简单的问题。您甚至可能怀疑它之前已经回答过,但不完全是。我已经在网上进行了大量搜索(包括堆栈溢出),但一直找不到答案。

这是我能找到的最接近的东西:一起使用 has_one 和 belongs_to但是它并不能完全回答我的问题。

我正在使用 Rails 4 和 MySQL

数据库结构如下:

合作伙伴表

id
name
primary_contact_id

联系人表

id
partner_id
first_name
last_name

很直截了当,对吧?不言自明。

class Partner < ActiveRecord::Base

    has_one :primary_contact, :class_name => "Partners::Contact", :primary_key => 'primary_contact_id'

    has_many :contacts, :class_name => "Partners::Contact"

    accepts_nested_attributes_for :primary_contact

    validates_presence_of :primary_contact

end

class Partners::Contact < ActiveRecord::Base

    belongs_to :partner

end

如您所见,在创建合作伙伴时,需要一个主要联系人(表格等都已正确设置)

我遇到的唯一问题是,当 primary_contact 与合作伙伴一起创建时,ActiveRecord 不明白它需要将正在创建的联系人上的 partner_id 分配给正在创建的 partner_id ......

这里的最佳实践?我不想在联系人表中创建一个列来指示(布尔或其他)该联系人是否是主要联系人。这不是正确的数据库规范化(不管“rails 约定”吹捧什么)。

感谢您的帮助和想法!

4

1 回答 1

0

我假设您正在以类似于以下方式创建合作伙伴:

Partner.create params[:partner] # { ..., primary_contact: {} }

因此,rails 无法知道您正在这里创建联系。一种不调整架构的简单解决方案是使用额外的查询来规范化数据:

class Partner
  after_create :update_primary_contact

  def update_primary_contact
    self.contacts << self.primary_contact
  end
end
于 2013-10-24T21:13:03.603 回答