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

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

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

例:

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

这将返回所有用户并预加载评论(如果存在)。 如果我在where添加“comments”关联的一些条件,那么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方法生成它,并且`joins’不会预加载关联。

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

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)