2012-02-29 88 views
1

在活動記錄中引用同一模型是否有可能擁有並且屬於許多關係?HABTM與自我的關係?

我想建模一個兄弟型的關係。

class Child < ActiveRecord::Base 
    has_and_belongs_to_many :siblings 
end 

到目前爲止,我已經創建了一個兄弟姐妹鏈接表:

class CreateSiblings < ActiveRecord::Migration 
    def change 
    create_table :siblings do |t| 
     t.integer :child1_id 
     t.integer :child2_id 
     t.timestamps 
    end 
    end 
end 

但我擔心這將導致我爲了得到在實際情況下寫醜陋的代碼:

siblings = [] 
child1.siblings.each do |s| 
    siblings << s.child2 
end 

我寧願能夠通過寫作得到一組兒童:

child1.siblings 

我想知道我的鏈接表和模型關聯應該如何支持這一點?

感覺就像我缺少一些非常明顯的東西。

我在Rails 3.1上。謝謝你的幫助!

+0

據我看到的,兄弟姐妹總是喜歡parent.children減去實際的孩子,所以我乍一看,這額外的表似乎是不必要的開銷。至少只要你不添加更多的功能或信息。當然你需要這個嗎? – 2012-02-29 12:12:18

+0

不幸的是,請參閱我對Ekampp的評論。在我的模型中,兒童有法定監護人,他們可能會這樣做,但並不總是與他們的兄弟姐妹分享。 – Chris 2012-02-29 12:29:39

回答

4

方法1:

我只想增加一個名爲像parent_id列。

然後,我會做一個實例方法的模型,是這樣的:

def children 
    Model.where({ parent_id: id }) 
end 

如果你願意,你可以做這樣的事情父:

def parent 
    Model.where({ id: parent_id }).first 
end 

然後你可以收集兄弟姐妹是這樣的:

def siblings 
    parent.children.reject{ |r| r == self } 
end 

方法2:

您也可以嘗試與belongs_to關係,是這樣的:

belongs_to :parent, class_name: "Model", foreign_key: :parent_id 

但我不是百分之百肯定此方法。在它工作之前,您可能需要調整一下。

我希望它能幫助:)

\\周華健

+0

這是一個整潔的想法,不幸的是這種模式必須支持分裂家庭,所以我不能保證2個兄弟姐妹必須有一個共同的父親:( – Chris 2012-02-29 12:25:33

+0

你也可以使用'sibling_id'列標記他們,然後使用將兄弟姐妹鏈接在一起? – Ekampp 2012-02-29 12:33:02

+0

在這種情況下,每個孩子都不會被限制爲一個兄弟姐妹嗎? – Chris 2012-02-29 12:42:08