2015-10-17 2 views
0

У меня многоуровневая структура модели, и я пытаюсь создать запрос, в котором я могу искать либо атрибут главной родительской модели, либо последнюю модель в изменении ассоциации. Моя структура выглядит следующим образом:Запрос Rails на разных моделях в цепочке многоуровневых ассоциаций

class Parent 
    attr_accessible :pname 
    has_one :child 
end 

class Child 
    has_many :infos 
end 

class Info 
    has_one :setting 
end 

class Setting 
    has_many :subsettings 
end 

class Subsetting 
    attr_accessible :sname 
end 

То, что я пытаюсь сделать, это создать где запрос, где я могу тянуть все родитель, где либо «PNAME = X» или «SNAME = X». Тем не менее, я не уверен в том, как создавать глубокие ассоциации: есть ли способ сделать это с помощью активной записи, или лучше создать запрос mysql напрямую?

ответ

1

Я печатаю это от руки, так что возможно, это будет не 100%, но вы должны быть в состоянии сделать что-то вроде следующего ...

class Parent 
    has_one :child 
    has_many :infos, through: :child 
    has_many :settings, through: infos 
    has_many :subsettings, through: :settings 
    ... 
end 

Тогда вы должны быть в состоянии назвать ...

Parent.joins(:subsettings).where("parent.pname = ? OR subsetting.sname =?", x) 

Две вещи, чтобы отметить о .where() вызова:

  1. Потому что вы QUER ying против нескольких соединенных таблиц, вам нужно предирировать столбец с именем таблицы.

  2. Название таблицы является единственным, а не множественным. Вот почему subsetting и не subsettings.