簡體   English   中英

Rails渴望在索引上加載自定義has_many

[英]Rails eager load custom has_many on index

Ruby 2.1,Rails 3.2
我的項目模型中有這種關系

scope :active, -> { where( deleted_at: nil ) }
has_many :foremen, class_name: "ProjectsUser",  conditions: ['current_foreman = 1']

在控制器中:

@projects = Project.includes(:foremen).active

生成此SQL

ProjectsUser Load (3.3ms)  SELECT `projects_users`.* FROM `projects_users` WHERE `projects_users`.`project_id` IN (122, 130, ...etc.) AND ( current_foreman = 1)

但是當我在視圖中調用關系時...

<% @projects.each do |project| %>
  <%= project.foremen.current_foreman %>
<% end %> 

每次都運行另一個SQL查詢。

ProjectsUser Load (2.5ms)  SELECT `projects_users`.* FROM `projects_users` WHERE `projects_users`.`project_id` = 122 AND (current_foreman = 1 )
ProjectsUser Load (2.5ms)  SELECT `projects_users`.* FROM `projects_users` WHERE `projects_users`.`project_id` = 130 AND (current_foreman = 1 )
ProjectsUser Load (2.5ms)  SELECT `projects_users`.* FROM `projects_users` WHERE `projects_users`.`project_id` = 151 AND (current_foreman = 1 )
etc...

我誤會了嗎? 這些記錄不應該已經加載了嗎?
我該怎么寫,這樣它只對ProjectsUser運行一個查詢?

我認為這是正常現象,您在項目循環中稱它為“正常”。

所以我做了一些進一步的挖掘,發現我的邏輯是正確的; 這不會自行生成任何其他查詢。 問題是我在對象上調用的方法。

以下不會調用任何查詢:

 project.current_foremen_and_managers.select{|f| f.current_foreman}.sort_by{ |f| f.added_at}.first

但是,當您將額外的邏輯移到關聯類的方法中時,它會生成更多的sql

class ProjectUser < ActiveRecord::Base
  def self.find_first_foreman
    select{|f| f.current_foreman}.sort_by{ |f| f.added_at}.first
  end
end

然后,如果我調用此方法,它將運行查詢

project.current_foremen_and_managers.find_first_foreman

我不確定為什么會發生這種情況,如果有人有解釋,我很想聽聽。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM