【问题标题】:Rails 3 ActiveRecord#includes bug?Rails 3 ActiveRecord#includes 错误?
【发布时间】:2017-01-25 06:24:36
【问题描述】:

我有以下型号

class Account < ActiveRecord::Base
  belongs_to :user
end

class User < ActiveRecord::Base
  attr_accessible :email
  has_many :accounts
end

据我所知,为了选择所有具有电子邮件匹配模式的用户的所有帐户,我们必须加入

Account.joins(:user).where("users.email ILIKE ?", '%pattern%') -> work

魔法来了,用连接代替包含,仍然像魅力一样工作

Account.includes(:user).where("users.email ILIKE ?", '%pattern%') -> work

但是

Account.includes(:user).where("users.email ILIKE ?", '%pattern%').count -> error

有什么解释吗?不只包括 Eager Loading 吗?

【问题讨论】:

  • 你能发布你得到的错误吗?
  • 试试,。 Account.includes(:user).where("users.email ILIKE ?", '%pattern%').length
  • 如果您在 where 条件下使用表,则实际上包含左外连接,这就是您获得结果的原因
  • 这个命令对你有用吗? Account.includes(:user).where("users.email ILIKE ?", '%pattern%')

标签: ruby-on-rails


【解决方案1】:

因为没有显式引用 includes 在单独的查询中加载关系。看看 rails 控制台:

[11] pry(main)> Account.includes(:user)
  AccountsUser Load (4.6ms)  SELECT "accounts".* FROM "accounts"
  User Load (11.7ms)  SELECT "users".* FROM "users" WHERE "users"."id" IN (...

[11] pry(main)> Account.includes(:user).where("users.email ILIKE ?", '%pattern%').to_sql
  SELECT "accounts".* FROM "accounts" WHERE (users.email ILIKE '%admin%')

这就是您收到错误的原因 - 查询中未引用 users 表。要引用用户表,请使用referenceseager_load

Account.includes(:user).references(:users).where("users.email ILIKE ?", '%pattern%').count

Account.eager_load(:user).where("users.email ILIKE ?", '%pattern%').count

注意includes 使用关联名称,而references 需要实际的表名称

【讨论】:

  • 但问题是 Account.includes(:user).where("users.email ILIKE ?", '%pattern%') 仍然可以正常工作,只有在调用计数时才会中断 Account.includes(:user).where("users.email ILIKE ?", '%pattern%').count
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-06-07
  • 2017-01-13
相关资源
最近更新 更多