乍一看,这可能看起来像一个简单的问题。您甚至可能怀疑之前已经回答过,但相当。我已经做了大量的网络搜索(包括堆栈溢出),但一直无法找到答案。
这是我能找到的最接近的东西:Using has_one and belongs_to together然而它并没有完全回答我的问题。
我正在使用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。 ..
这里的最佳做法?我不想在联系人表格中创建一个列(bool或其他),如果该联系人是主要联系人。这不是正确的数据库规范化(无论“轨道约定”是什么)。
感谢您的帮助和想法!
答案 0 :(得分: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