2

Я работаю над приложением Rails 3, который имеет (ради этого вопроса) Posts связана с нескольких Categories и наоборот через has_and_belongs_to_many ассоциации:бывшее Сообщение связанно с обеими из двух категорий в Rails 3 без пользовательского SQL

Post < ActiveRecord::Base 
    has_and_belongs_to_many :categories 
end 

Category < ActiveRecord::Base 
    has_and_belongs_to_many :posts 
end 

Я пытаюсь выяснить, как написать ActiveRecord (или AREL) искатель, который извлекает все Postsгде каждый сообщение связан с как двух Categories. Я понимаю SQL, который я в конечном счете пытаюсь сгенерировать (два INNER JOINS с псевдонимами, чтобы иметь возможность различать каждый из них для сопоставления на каждом из двух Categories), но до сих пор я не выяснил способ создания запроса не прибегая к исходным битам SQL.

Причина, по которой избегание пользовательского SQL так важна, заключается в том, что код, который я пишу, носит общий и сильно управляемый данными, и ему нужно смешивать с другими фильтраторами (и сортировкой) по запросу для объектов Post , поэтому я не могу просто жестко запрограммировать вызовы методов на Post (например, получить доступ к коллекции Categories) или настраиваемый SQL, который может плохо сочетаться с SQL, сгенерированным другими фильтрами.

Я открыт для перехода на использование модели объединения (has_many :through), если это как-то упрощает или даже рассматривает другие опции ORM (DataMapper, Mongoid и т. Д.), Но это кажется огромным изменением только для получить что-то такое основное.

Я ошеломлен тем, что это нелегко/очевиднее в ActiveRecord/ARel, но, возможно, я просто не знаю волшебных ключевых слов, чтобы найти ответ. Документация для AREL также удивительно тонкая, поэтому я в недоумении. Любая помощь приветствуется!

ответ

0

После совсем немного более Googling, я нашел эти две статьи (с 2006 года!), Что в конечном счете приведет меня к правильному ответу в ActiveRecord/AREL:

http://blog.hasmanythrough.com/2006/6/12/when-associations-arent-enough

http://blog.hasmanythrough.com/2006/6/12/when-associations-arent-enough-part-2

В (почти) SQL-код, который создает то, что я ищу, - довольно умное использование операторов GROUP BY и HAVING в SQL:

В принципе, он находит все Posts, связанный с любой данного Categories (в том числе дубликатов, если, как мы надеемся, есть Posts, которые соответствуют множественным Categories), группам, список по id полям на Post, затем обрежут результаты вниз, чтобы включать только группы, которые имеют ровно столько совпадений, которые мы хотим.

Я не пробовал смешивать этот код с моими фильтрами в других полях на Post, но я уверен, что он сработает.

+0

Это действительно работает, хотя вы не можете делать это более чем в ассоциации «многие-ко-многим» одновременно, но работает для меня. –

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

  • Нет связанных вопросов^_^