我可以为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
方法生成它,并且`加入'没有预先加载协会。
你对我有什么建议?谢谢!
答案 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)