Ruby on rails 快速加载和使用';其中';方法
我正在运行RubyonRails3.1。我使用的是Ruby on rails 快速加载和使用';其中';方法,ruby-on-rails,ruby,ruby-on-rails-3,ruby-on-rails-3.1,eager-loading,Ruby On Rails,Ruby,Ruby On Rails 3,Ruby On Rails 3.1,Eager Loading,我正在运行RubyonRails3.1。我使用的是includes方法,我想了解为什么在一个急切加载的集合上调用where方法时,它会重新加载相关对象,而不是在急切加载的集合中查找该对象。由于所有相关对象都已被急切加载,我希望where方法不会命中数据库来重新加载这些对象 也就是说,我有以下几点: article_categories = article .categories .where(:user_id => @current_user.id) .incl
includes
方法,我想了解为什么在一个急切加载的集合上调用where
方法时,它会重新加载相关对象,而不是在急切加载的集合中查找该对象。由于所有相关对象都已被急切加载,我希望where
方法不会命中数据库来重新加载这些对象
也就是说,我有以下几点:
article_categories =
article
.categories
.where(:user_id => @current_user.id)
.includes(:comments)
如果我跑
# CASE 1:
article_categories.each do |article_category|
article_category.comments.map(&:title)
end
急切加载按预期工作:避免了“N+1查询问题”。但是,上面的代码还返回没有“:user\u id==@current\u user.id
”的注释标题,但我根本不想检索这些标题
因此,由于我认为通过使用渴望加载,我已经获得了所有注释,因此我使用了另一个where(:user\u id=>@current\u user.id)
语句,如以下代码所示:
# CASE 2:
article_categories.each do |article_category|
article_category.comments.where(:user_id => @current_user.id).map(&:title)
end
然而,在这种情况下,急切加载并没有像预期的那样工作:无法避免“N+1查询问题”。。。但是注释有“:user\u id==@current\u user.id
”
我想用“
:user\u id==@current\u user.id
”(我如何通过利用渴望加载来实现这一点?),我想了解为什么where
语句取消渴望加载效果。在案例1中,where子句仅适用于类别。如果您还希望将其应用于评论,可以执行以下操作:
article_categories =
article
.categories
.includes(:comments)
.where('categories.user_id = ? AND comments.user_id = ?', @current_user.id, @current_user.id)
其中
方法“指“/”在“类别
上运行,而不是在注释
上运行。categories
和comments
都具有user\u id
属性/列。因此,您需要在categories和comments上使用where子句??什么意思?您的问题似乎是关于这样一个事实,即有些注释没有user\u id==@current\u user.id
。我的回答解决了这个问题。我的意思是我想检索所有类别。其中(:user\u id=>@current\u user.id)
并立即加载所有文章。注释。其中(:category\u id=>category\u id,:user\u id=>@current\u user.id)
category\u id
是所提到的类别的数组。其中(:user\u id=>@current\u user.id)
。附言:我不知道我是否清楚,“有些评论没有user_id==@current_user.id”。是的,是的。我在上节课上提出了一个更具体的问题。