Rails Eager loading(包括)和where子句不起作用?

Eki*_*bal 1 activerecord ruby-on-rails eager-loading ruby-on-rails-4

我正在使用Rails 4.1和我的模型:

Client has_many TicketLists
TicketList has many projects
Run Code Online (Sandbox Code Playgroud)

现在,我正在尝试在客户端模型中使用eager loading,例如:

class Client < ActiveRecord::Base
  def ticket_lists_with_project_id(project_id)
    ticket_lists.includes(:projects).where("projects.id = ?", project_id)
  end  
end  
Run Code Online (Sandbox Code Playgroud)

当我这样做时:

Client.find(2).ticket_lists_with_project_id(1)
  Client Load (1.7ms)  SELECT  "clients".* FROM "clients"  WHERE "clients"."is_destroyed" = 'f' AND "clients"."is_closed" = 'f' AND "clients"."id" = $1 LIMIT 1  [["id", 2]]
PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "projects"
LINE 1: ...d" = 'f' AND "ticket_lists"."client_id" = $1 AND (projects.i...
                                                             ^
: SELECT "ticket_lists".* FROM "ticket_lists"  WHERE "ticket_lists"."is_destroyed" = 'f' AND "ticket_lists"."client_id" = $1 AND (projects.id = 1)
ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "projects"
LINE 1: ...d" = 'f' AND "ticket_lists"."client_id" = $1 AND (projects.i...
Run Code Online (Sandbox Code Playgroud)

Aru*_*hit 10

试试以下内容:

class Client < ActiveRecord::Base
  def ticket_lists_with_project_id(project_id)
    ticket_lists.includes(:projects)
                .where("projects.id = ?", project_id)
                .references(:projects)
  end  
end
Run Code Online (Sandbox Code Playgroud)

它会工作.如果要为包含的模型添加条件,则必须明确引用它们.另请注意,includesreferences需要实际表名的情况下使用关联名称.