Rails包括与左连接中的条件的关联

时间:2015-04-16 23:13:08

标签: ruby-on-rails associations left-join filtering

我可以为Rails为LEFT JOIN方法生成的includes sql添加一些条件吗? (Rails 4.2.1,postresql)。

我需要通过预加载来获取所有(!)用户(当我将放置关联的评论,帖子等视图时,不是N + 1),但是需要根据某些条件过滤关联。

示例:

User.includes(:comments) 
# => SELECT * FROM users LEFT JOIN comments ON ...

这将返回所有用户并预加载评论(如果存在)。 如果我要为"评论"添加一些条件where中的关联,然后SQL不会返回所有用户,例如:

User.includes(:comments).where(comments: {published_at: Date.today})
# => SELECT * FROM users LEFT JOIN comments ON ... WHERE comments.published_at = ...

这将仅返回今天发布的评论用户。

我需要在LEFT JOIN 中添加条件并保存预加载(将对象加载到内存中 - 使用joins方法的简单左连接不会预加载关联)。

SELECT * FROM users LEFT JOIN comments ON (... AND comments.published_at = ...)

那些SQL将正确返回我所需要的(所有用户及其评论,如果存在,则在请求的日期发布)!但是......我无法用Rails includes方法生成它,并且`加入'没有预先加载协会。

你对我有什么建议?谢谢!

1 个答案:

答案 0 :(得分:1)

Rails没有框架库中的方法来执行您想要的操作。 这可能有用,但

class User < ActiveRecord::Base
  has_many :comments
  has_many :recent_comments, -> { where(published_at: Date.today) }, class_name: "Comment"
end

然后查询用户并预加载recent_comments

@users = User.preload(:recent_comments)