Сложный запрос полиморфной ассоциации - PullRequest
0 голосов
/ 06 марта 2019

У меня есть модель 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 Ответ

3 голосов
/ 06 марта 2019

Да, вам просто нужно сообщить ActiveRecord, что вы планируете запросить к check_ins таблице (AR знает, если предложение where выглядит как check_ins: { anything }, т.е. это Hash, но не знаю, если это String, как здесь), так что он сделал left join, как это:

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

или с eager_load:

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

Кроме того, если вы используете Ruby 2.6, возможно, можно использовать бесконечный диапазон, но я не уверен, что он работает (хотя я был бы рад, если бы это было так, это выглядит круто :)):

Review.includes(:check_in).where(check_ins: Date.today..)
...