【发布时间】:2017-02-15 15:19:45
【问题描述】:
我有用户发送给其他用户的帖子。有两种模型 - :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 })
有没有更好的,也许更清洁的方法来做到这一点?
提前致谢
【问题讨论】:
-
你是在 Rails3 中还是在 2.3.x 中?
-
仍在 2.3 中。希望看到两者的解决方案
标签: ruby-on-rails activerecord