2012-02-29 3 views
1

Возможно ли иметь a и принадлежит многим отношениям в активной записи, которые ссылаются на одну и ту же модель?Связь 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 

Мне интересно, как мои ссылки и ассоциации моделей должны выглядеть, чтобы поддержать это?

Почувствуйте, что у меня что-то действительно очевидно.

Я нахожусь на рельсах 3.1. Спасибо за любую помощь!

+0

Насколько я вижу, братья и сестры всегда как parent.children минус фактического ребенка, поэтому мне на первый взгляд этот дополнительный стол кажется излишнюю нагрузку. По крайней мере, пока вы не добавите дополнительных функций или информации. Вам это нужно? –

+0

К сожалению, да, см. Мой комментарий к Ekampp. В моей модели у детей есть законные опекуны, которые они, вероятно, будут, но не всегда будут делиться со своими братьями и сестрами. – Chris

ответ

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 

Но я не на 100 процентов уверены, об этом методе. Возможно, вам придется немного подкорректировать это, прежде чем это сработает.

Я надеюсь, что это помогает :)

\\ Эмиль

+0

Это хорошая идея, к сожалению, эта модель должна поддерживать разделенные семьи, поэтому я не могу гарантировать, что у двух братьев и сестер обязательно будет общий родитель :( – Chris

+0

Вы также можете отметить их столбцом 'sibling_id', а затем использовать чтобы связать братьев и сестер вместе? – Ekampp

+0

В этом случае не каждый ребенок был бы ограничен одним братом? – Chris

Смежные вопросы