avi*_*ing 7 activerecord ruby-on-rails
我有用户发送给其他用户的帖子.有两种模式 - :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"
Run Code Online (Sandbox Code Playgroud)
两者:user和:post都有"is_public"列,表示单个帖子和/或整个用户配置文件可以是公共的或私有的.
我的目标是获取公开的帖子列表,其收件人具有公开个人资料.同时,我想"包含"发件人和收件人信息,以最大限度地减少db调用次数.挑战在于我通过命名关联有效地"包括"了同一个表两次,但在我的"条件"中,我需要确保我只过滤收件人的"is_public"列.
我无法执行以下操作,因为"条件"不接受关联名称作为参数:
Post.find(:all, :include => [ :to_user, :from_user ],
:conditions => { :is_public => true, :to_user => { :is_public => true }})
Run Code Online (Sandbox Code Playgroud)
因此,我可以通过在"users"表上执行额外的"join"来实现此目的:
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 })
Run Code Online (Sandbox Code Playgroud)
有没有更好的,也许更清洁的方法来做到这一点?
提前致谢
我无法找到比我的问题中最初提出的解决方案更好的解决方案。这个不依赖于 Rails 在编译查询时如何命名/别名表,因此看起来比替代方案更干净(不使用第 3 方 gems 或插件):
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 })
Run Code Online (Sandbox Code Playgroud)