Я разрабатываю модель сертификации для следующих целей.У пользователя будет набор сертификатов, скажем, [A, B, C, D].У статьи также будет набор сертификатов, скажем, [B, D].Я хочу, чтобы я мог найти статьи, где их сертификаты представляют собой некоторое подмножество (читай: любое подмножество) сертификатов пользователя.То есть, если бы статья имела сертификаты [A, B, E], она не была бы возвращена, но если бы у нее были [A] или [A, D] или что-то еще, она вернулась бы в порядке.На самом деле, я предполагаю, что это пересечение user.certs с art.certs и обеспечение того, что результирующий набор равен art.certs.size.Я реализовал это как HABTM, так как мне действительно не нужен доступ к объекту соединения, но у меня возникают проблемы при разработке логики.Я закончил тем, что сделал что-то вроде этого:
@certs = @user.certifications.collect{|c| c.id}
Article.all(:joins=>:certifications,
:group=>Article.attributes_for_sql,
:select=>'articles.*',
:conditions => ['certifications.id in (?)', @certs],
:having=> "count(articles.id)=(select (count(article_id)) from articles_certifications where article_id = articles.id group by article_id)")
Кажется, это работает, но чрезвычайно уродливо.
В любом случае, как мне разработать эти отношения, чтобы сделать это как можно проще икак бы выглядел пример решения?
Спасибо за любую помощь, я действительно бился головой об стену на этом.