У меня есть сообщения, которые отправляются пользователями другим пользователям. Существует две модели-: сообщение и: пользователь, и: сообщение имеет следующие именованные ассоциации:
belongs_to :from_user, :class_name => "User", :foreign_key => "from_user_id"
belongs_to :to_user, :class_name => "User", :foreign_key => "to_user_id"
Оба: пользователь и: сообщение имеет "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 })
Существует ли лучшее, возможно, более чистое, способ сделать это?
Заранее спасибо