【发布时间】:2011-02-03 23:31:40
【问题描述】:
我在使用 Rails 3 急切加载时在关联表上使用条件时遇到问题。 Rails 在加载原始模型数据时似乎正在应用该条件,因此除非非零数量的子/关联模型与条件匹配,否则它不会加载父模型。这在代码中更容易解释(例如简化):
@post = Post.includes(:comments).where(:comments => { :approved => true }).find(1)
这将生成类似于以下内容的 SQL 查询:
SELECT DISTINCT `posts`.id FROM `posts`
LEFT OUTER JOIN `comments` ON `comments`.`post_id` = `posts`.`id`
WHERE (`comments`.`approved` = 1) AND (`posts`.`id` = '1')
LIMIT 1
如果没有任何满足approved = 1 条件的 cmets,则不会返回任何行,因此根本不会加载 Post。
什么是正确加载帖子和相关 cmets 的正确方法?
更新
我仍然希望听到更好的方法,但现在我正在使用以下方法来解决它(适用于深度嵌套的急切加载):
@post = Post.find(1)
@comments = @post.comments.where(:approved => true).all
# allows deeper/more complex nesting without getting into SQL:
@post = Post.includes(:author => [ :websites, :photo ]).find(1)
@comments = @post.comments.includes(:editor).where(:approved => true).all
【问题讨论】:
标签: ruby-on-rails ruby ruby-on-rails-3 activerecord eager-loading