has_one和belongs_to在一起

时间:2013-10-24 20:51:14

标签: ruby-on-rails activerecord rails-activerecord database-normalization

乍一看,这可能看起来像一个简单的问题。您甚至可能怀疑之前已经回答过,但相当。我已经做了大量的网络搜索(包括堆栈溢出),但一直无法找到答案。

这是我能找到的最接近的东西: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或其他),如果该联系人是主要联系人。这不是正确的数据库规范化(无论“轨道约定”是什么)。

感谢您的帮助和想法!

1 个答案:

答案 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