Я работаю над приложением 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 также удивительно тонкая, поэтому я в недоумении. Любая помощь приветствуется!
Это действительно работает, хотя вы не можете делать это более чем в ассоциации «многие-ко-многим» одновременно, но работает для меня. –