为什么 where() 方法 运行 SQL 在所有嵌套关系都被预先加载后查询?
Why does the where() method run SQL queries after all nested relations are eager-loaded?
在索引视图的控制器方法中,我有以下行。
@students_instance = Student.includes(:memo_tests => {:memo_target => :memo_level})
所以对于每个 Student
我都急于加载所有必要的信息。
稍后在 .map
块中,我对其中一个关系调用 .where()
方法,如下所示。
@all_students = @students_instance.map do |student|
...
last_pass = student.memo_tests.where(:result => true).last.created_at.utc
difference_in_weeks = ((last_pass.to_i - current_date.to_i) / 1.week).round
...
end
这导致每个 student
. 的单个 SQL 查询而且由于我有 300 多名学生,导致加载时间非常慢并且超过 300 多个 SQL 个查询。
我认为这是由 .where()
方法引起的,对吗?我认为这是因为我已经检查了所有其他内容,而这些是导致所有查询的两行。
更重要的是,是否有更好的方法将这些查询减少为单个查询?
在您询问 where
的那一刻,语句就被转换为查询。通常,结果应该是 sql-cached...
无论如何,为了确定,您可以改为将编程逻辑添加到您的语句中。这样,您就不会请求 NEW sql 语句。
last_pass = student.memo_tests.map {|m| m.created_at if m.result}.compact.sort.last
编辑
我看到 OP 的问题不需要排序......所以,把排序放在一边:
last_pass = student.memo_tests.map {|m| m.created_at if m.result}.compact.last
compact
需要从数组中删除 nil 结果。
在索引视图的控制器方法中,我有以下行。
@students_instance = Student.includes(:memo_tests => {:memo_target => :memo_level})
所以对于每个 Student
我都急于加载所有必要的信息。
稍后在 .map
块中,我对其中一个关系调用 .where()
方法,如下所示。
@all_students = @students_instance.map do |student|
...
last_pass = student.memo_tests.where(:result => true).last.created_at.utc
difference_in_weeks = ((last_pass.to_i - current_date.to_i) / 1.week).round
...
end
这导致每个 student
. 的单个 SQL 查询而且由于我有 300 多名学生,导致加载时间非常慢并且超过 300 多个 SQL 个查询。
我认为这是由 .where()
方法引起的,对吗?我认为这是因为我已经检查了所有其他内容,而这些是导致所有查询的两行。
更重要的是,是否有更好的方法将这些查询减少为单个查询?
在您询问 where
的那一刻,语句就被转换为查询。通常,结果应该是 sql-cached...
无论如何,为了确定,您可以改为将编程逻辑添加到您的语句中。这样,您就不会请求 NEW sql 语句。
last_pass = student.memo_tests.map {|m| m.created_at if m.result}.compact.sort.last
编辑 我看到 OP 的问题不需要排序......所以,把排序放在一边:
last_pass = student.memo_tests.map {|m| m.created_at if m.result}.compact.last
compact
需要从数组中删除 nil 结果。