9

我一直在玩STI和belongs_to/has_many關係,我有點困惑。Rails問題:belongs_to與STI - 我如何正確地做到這一點?

我有一個基於類似模型配置幾個問題:

class Parental < ActiveRecord::Base 
end 

class Mother < Parental 
    has_many :babies 
end 

class Father < Parental 
    has_many :babies 
end 

class Baby < ActiveRecord::Base 
    belongs_to :?????? 
end 
  1. 應該怎樣Baby belong_to?
  2. 就遷移而言,我應該如何爲 表babies表中的外鍵命名/添加外鍵?
  3. 我已經很難研究這個,有沒有一個明確的來源 解釋這一點? API文檔似乎沒有打到頭上 或者我錯過了它(這是完全可能的)。

我首先想到的是用一種方法一起添加到parental_idbabiesBaby#owner執行以下操作:

  • 點擊self.parental
  • 確定家長的類型
  • 返回正確的類型父母(可能是母親,可能是父親)

Tha你好!

回答

7

Baby屬於兩個MotherFather

belongs_to :mother 
belongs_to :father 

你可以有多個外鍵。該Baby數據庫表,然後有兩個字段,mother_idfather_id

的明確指導協會是在這裏:http://guides.rubyonrails.org/association_basics.html

遷移創建Baby類將是這個樣子:

class CreateBabies < ActiveRecord::Migration 
    def self.up 
    create_table :babies do |t| 
     t.integer :father_id 
     t.integer :mother_id 
    end 
    end 

    def self.down 
    drop_table :babies 
    end 
end 

這給你的東西,如: baby.motherbaby.father。你不能有一個parental_id,因爲外鍵只能指向另一個記錄,這意味着嬰兒只有一個父母(當他們有兩個時)。

好像,在這種情況下,你只是誤解了關係,就是這樣。你在正確的軌道上。

+0

謝謝你的迴應。我可以打擾你看​​@我的更新和評論該解決方案?似乎不像桌子混亂,但可能完全錯誤。 –

+0

當然,我評論過'parental_id'解決方案,它不起作用。 – jefflunt

+0

啊!這是完全合理的。再次感謝。我將你的答案標記爲解決方案。我確實有一個跟進q,希望不會太麻煩。正如你所提到的,在這種情況下,你真的需要兩個所有者作爲一個孩子(除了耶穌)將永遠有兩個父母。當所有權對象只能屬於一個所有者時,你做什麼?例如,說'Post',STI設置是'Author','LivingAuthor

3

我已經通過添加明確的foreign_key調用來解決類似的問題。

類似下面的代碼:

class Parental < ActiveRecord::Base 
end 

class Mother < Parental 
    has_many :babies 
end 

class Father < Parental 
    has_many :babies 
end 

class Baby < ActiveRecord::Base 
    belongs_to :mother, foreign_key: 'parental_id' 
    belongs_to :father, foreign_key: 'parental_id' 
end 

當然,這個假設一個嬰兒只有一個父。 :-)

相關問題