复杂的多态关联查询

时间:2019-03-06 12:56:55

标签: ruby-on-rails polymorphism associations

我有一个Review模型和一个CheckIn模型:

class Review < ApplicationRecord
    belongs_to :reviewable, polymorphic: true
    belongs_to :check_in, -> { where( reviews: { reviewable_type: "CheckIn"} ).includes(:review) }, foreign_key: 'reviewable_id', optional: true   
end

class CheckIn < ApplicationRecord
    has_one :review, as: :reviewable
end

并希望能够提取日期范围内:reviews的所有:check_ins。例如:

Review.includes(:check_in).where("check_ins.created_at >= ?", Date.today)

此操作由于以下原因而失败:

  

ActiveRecord::StatementInvalid: PG::UndefinedTable: ERROR: missing FROM-clause entry for table "check_ins"

有什么办法可以做到这一点?理想情况下,我想要一个ActiveRecord::Relation而不是一个数组。

1 个答案:

答案 0 :(得分:3)

是的,您只需要让ActiveRecord知道您打算针对check_ins表进行查询(AR知道,如果where子句看起来像check_ins: { anything },即它是{{ 1}},但不知道它是否为Hash(例如此处),因此它确实为String,如下所示:

left join

或使用Review.includes(:check_in).references(:check_ins).where('check_ins.created_at >= ?', Date.today)

eager_load

此外,如果您使用的是Ruby 2.6,则可以使用无限范围,但是我不确定它是否有效(尽管我很高兴,它看起来很酷:)):

Review.eager_load(:check_in).where('check_ins.created_at >= ?', Date.today)