У меня есть сообщения, которые пользователи отправляют другим пользователям.Существует две модели -: post и: user, и: post имеет следующие именованные ассоциации:
belongs_to :from_user, :class_name => "User", :foreign_key => "from_user_id"
belongs_to :to_user, :class_name => "User", :foreign_key => "to_user_id"
Обе: user и: post имеют столбец "is_public", указывающий, что либо один пост, и / иливесь профиль пользователя может быть общедоступным или личным.
Моя цель - получить список сообщений, которые являются общедоступными И чьи получатели имеют публичные профили.В то же время я хотел бы «включить» информацию об отправителе и получателе, чтобы минимизировать количество вызовов в БД.Проблема в том, что я эффективно «включаю» одну и ту же таблицу дважды через именованные ассоциации, но в своих «условиях» мне нужно убедиться, что я фильтрую только по столбцу «is_public» получателя.
Я могуне делайте следующее, потому что «условия» не принимают имя ассоциации в качестве параметра:
Post.find(:all, :include => [ :to_user, :from_user ],
:conditions => { :is_public => true, :to_user => { :is_public => true }})
Таким образом, один из способов сделать это - выполнить дополнительное «соединение» с таблицей «пользователи»:
Post.find(:all, :include => [ :to_user, :from_user ],
:joins => "inner join users toalias on posts.to_user_id = toalias.id",
:conditions => { :is_public => true, 'toalias.is_public' => true })
Есть ли лучший, возможно, чище способ сделать это?
Заранее спасибо