2014-09-09 3 views
0

Редактировать: Предположим, что A - это «Форум», B - «Тема», а C - «Почта».Запросы ассоциации транзитных моделей Rails

Модель A has_many B (B belongs_to A)

Модель B has_many C (C belongs_to B)

Вопрос: Как запросить непосредственно, как если бы Model A has_many C (и C belongs_to A)?

+0

попробуйте использовать 'A has_many C через B' –

+0

Пожалуйста, не используйте поддельные значения. Они могут вводить в заблуждение, вводить в заблуждение или и то, и другое. –

ответ

3

Предположим, что ваш «A» - это «Форум», ваш «B» - это «Тема», а ваш «C» - Post.

Форум

has_many :topics 
has_many :posts, through: :topics 

Тема

belongs_to :forum 
has_many :posts 

Сообщение

belongs_to :topic 

def forum 
    topic.forum 
end 
1

Райан Бигг прав с has_many :through (official documentation), но я хотел бы предложить, чтобы делегировать в противоположную сторону, как:

class Category < ActiveRecord::Base 
    has_many :foods 
    has_many :recipes, through: :foods 
end 

class Food < ActiveRecord::Base 
    belongs_to :category 
    has_many :recipes 
end 

class Recipe < ActiveRecord::Base 
    belongs_to :food 
    delegate :category, to: :food 
    allow_nil: true 
end 

Использование модуля # делегата гораздо более удобным по сравнению с методом делегирующей и использует синтаксические Рельсы предложения сахара. Вы также можете устанавливать префиксы и прочее. Читайте о законе demeter (Do not break the law of Demeter!) и Module#delegate API documentation тоже.

+0

интересно, спасибо за прочитанное! – gr8scott06

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