0

乍一看,這可能看起來像一個簡單的問題。你甚至可能懷疑它已被回答,但不是相當於。我已經做了大量的搜索網絡(包括堆棧溢出)並且一直無法找到答案。has_one和belongs_to在一起

這是我能找到的最接近的東西: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

我假設你在一個類似的方式建立合作伙伴:

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

所以沒有辦法導軌可以知道你在這裏創建接觸。一個沒有調整模式的簡單解決方案是使用額外的查詢來標準化數據:

class Partner 
    after_create :update_primary_contact 

    def update_primary_contact 
    self.contacts << self.primary_contact 
    end 
end 
+0

這聽起來像個好主意。我剛剛嘗試過,但是由於創建合作伙伴的方式,params.require(:partner).permit(:company_name,... primary_contact_attributes:...)我的測試仍然失敗... – Volte