【问题标题】:Changing from joins to includes breaking query从联接更改为包括中断查询
【发布时间】:2015-08-05 16:09:51
【问题描述】:

我有这个工作查询:

@search = Availability.joins{facility.activities}
.where{activities.id == s_activity}

但我的观点是从设施那里获得大量信息,这导致了 N+1 问题。

所以我决定我应该使用includes 来急切地加载我的关联

@search = Availability.includes{facility.activities}
.where{ facility.activities.id == s_activity)}

但这会导致错误:

!! #<ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR:  missing FROM-clause entry for table "activities"
LINE 1: ...T "availabilities".* FROM "availabilities" WHERE ("activitie...
                                                             ^

这些是关联:

class Activity < ActiveRecord::Base
  has_and_belongs_to_many :facilities
end

class Availability < ActiveRecord::Base
  # Associations
  belongs_to :facility
end

class Facility < ActiveRecord::Base
  #  Associations
  has_and_belongs_to_many :activities
  has_many :availabilities

end

有一个名为activities_facilities 的表用于has_and_belongs_to_many

【问题讨论】:

  • 我在 where 子句中尝试了不同的变体,但我得到了同样的错误
  • 试试Availability.includes(facility: [:activities]).where('facility.activities.id = ?', s_activity).references(:facility, :activities)
  • 返回错误pastebin.com/09Aj7cX5
  • 你可以试试这个Availability.includes(facility: [:activities]).where('activities.id = ?', s_activity).references(:facility, :activities) 吗?
  • 我刚刚在他们的文档中读到了这个:Includes works similarly with joins, it uses outer join defaultly. In Rails 4, you need to use references with includes together. 答案一直都在那里 -_- 非常感谢。如果您提交作为答案,我会给您功劳

标签: sql ruby-on-rails postgresql ruby-on-rails-4 squeel


【解决方案1】:

条件中使用includes时需要附加.references

Availability.includes(facility: [:activities]).where('activities.id = ?', s_activity).references(:facility, :activities)

如果您想为包含的模型添加条件,您必须 明确引用它们

参考includes中的条件部分

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-09
    • 2023-03-13
    • 2017-03-10
    • 2021-10-18
    • 1970-01-01
    • 2019-08-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多