2012-01-28 4 views
0

Скажем, у меня есть три модели:Database дизайн ... отдаленный связанные модели

class Parent < ActiveRecord::Base 
    has_many :children 
end 

class Child < ActiveRecord::Base 
    belongs_to :parent 
    has_many :grandchildren 
end 

class Grandchild < ActiveRecord::Base 
    belongs_to :children 
end 

Я буду делать много запросов, чтобы найти внук родителей. Является ли наиболее эффективным выполнение множественных объединений, или было бы лучше добавить другое отношение к Parent в has_many: :grandchildren и Grandchild в belongs_to :parent? Похоже, что это приведет к тому, что модели не будут синхронизированы, хотя в этом конкретном приложении отношения никогда не будут меняться после их установления.

Кроме того, что, если мы говорим о моделях более отдаленно связанных ... скажем, три или четыре соединения?

ОБНОВЛЕНИЕ: Чтобы уточнить, что я моделирую, на самом деле не родители/дети/внуки. Я думал, что более общие имена сделают его более ясными, но я вижу, как эти родовые на самом деле делали его более запутанным. Это больше похоже на то, что у продуктов есть части заказов, и мне нужно найти заказы, относящиеся к компании. Извините за путаницу.

+2

рекурсивная структура, вероятно, проще. – wildplasser

ответ

0

Как насчет правнуков? И т. Д.

Вы хотите, чтобы self-join на общий класс «человек».

Кроме того, есть такие вещи, как acts_as_tree или ancestry, с множеством реализаций, которые делают такие вещи тривиальными. Некоторые оптимизируются для поиска и могут загружать целую иерархию за один вызов.

+0

Спасибо, я на самом деле использую самообучение и родословную в других местах. Я просто пытался использовать некоторые общие имена для моего вопроса. В этой части действительно нет какого-либо рода родословных. Это больше похоже на то, что компания производит продукт, который имеет части, которые имеют заказы. Поэтому я хочу найти все заказы, относящиеся к конкретной компании. – Brenda

+0

Корпус «взорванных материалов» отлично подходит для рекурсивной структуры. Получение ограничений может быть затруднено. – wildplasser

+0

@Brenda IMO вопрос вводит в заблуждение; YMMV. Я бы использовал SQL напрямую, чтобы получить заказы компании. Или, скорее всего, я бы создал либо вспомогательную таблицу для коротких заказов компании ->, либо отдал приказы компании. –

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