2009-06-18 84 views
2

我跟隨this tutorial這是工作出色has_many:通過關係。我擁有像category_product一樣的正常工作。與ActiveRecord相同模型的多對多關聯?

但是,我不能概念化這種情況(也沒有得到它的工作):我有一個具有相關類別的類別。由於每個類別都可以有N個類別......首先,這實際上是多對多的情況(我相當肯定)。其次,這是什麼樣子?我的遷移是這樣的:

create_table :categories do |t| 
    t.string :name 
    t.timestamps 
end 

create_table :related_categories, :id => false do |t| 
    t.integer :category_a_id 
    t.integer :category_b_id 
end 

和我的模型的膽量

has_many :related_categories, :foreign_key=>"category_a_id" 
has_many :categories, :through => :related_categories, :source=>:category_a 

這顯然是不正確的,雖然它到達那裏(即,它是100%碎米)。我怎樣才能做到這一點?

編輯:我忘了這一點,但這裏只對SO(這意味着它不是問題的答案):

class RelatedCategory < ActiveRecord::Base 
    belongs_to :category_a, :class_name=>"Category" 
    belongs_to :category_b, :class_name=>"Category" 
end 

回答

2

你應該嘗試:source => :category_b在你的has_many聲明。

您已經使用category_a_id作爲相關類別表的外鍵。這基本上告訴ActiveRecord在獲取與其相關的所有related_categories記錄時,將related_categories表中的category_a_id字段與當前的Category對象ID進行匹配。此has_many :through聲明的源參數指定在填充類別集合時爲查找(或爲此寫入)相關對象時應考慮哪個字段。

+0

+1謝謝。這並沒有做到,但我開始重新審視整個關係。當我使用CategoryA時,它確實起作用,它從來沒有得到關係的另一面。我將運行一些更多的測試。 – 2009-06-18 22:44:16

0

下面是答案,但它並不漂亮。

has_many :related_categories, :foreign_key=>"category_a_id" 
    has_many :related_categories2, :class_name=>"RelatedCategory", :foreign_key=>"category_b_id" 
    has_many :categories, :through => :related_categories, :source=>:category_b 
    has_many :categories_backwards, :through => :related_categories2, :source=>:category_a 
    has_many :category_products 

那麼你將不得不做一些愚蠢的getter結合類別+ categories_backwards,或者什麼。

編輯[2分鐘後]:哇,與吸氣它幾乎看起來完美!當然,問題在於你必須推入類別,而不是從吸氣者那裏得到什麼。