为什么 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 结果。