Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 快速加载和使用';其中';方法_Ruby On Rails_Ruby_Ruby On Rails 3_Ruby On Rails 3.1_Eager Loading - Fatal编程技术网

Ruby on rails 快速加载和使用';其中';方法

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

我正在运行RubyonRails3.1。我使用的是
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”。是的,是的。我在上节课上提出了一个更具体的问题。