Я ищу способ предварительно загрузить отношение has_one, когда оно через has_many. У меня есть 4 соответствующие модели:
class Order
has_many :line_items
has_many :products, through: :line_items
has_one :review
has_many :review_items, through: :review
end
class Review
belongs_to :order
has_many :review_items
has_many :products, through: :review_items
end
class ReviewItem
belongs_to :review
belongs_to :product
has_one :order, through: :review
end
class LineItem
belongs_to :order
belongs_to :product
has_one :review, through: :order
# HERE IS RELATION IN QUESTION
has_one :review_item, ->(product) { where(product_id: line_item. product_id, review: line_item.review) }, foreign_key: "product_id", primary_key: "product_id"
end
Вопрос в том, как предварительно загрузить review_item
на LineItem
при загрузке через line_item
, чтобы я мог сделать что-то вроде Order.include(line_items: [:review_item]).where(user: user)
В настоящее время я получаю сообщение об ошибке
Область ассоциации review_item
зависит от экземпляра (блок области действия принимает аргумент). Предварительная загрузка зависимых от экземпляра областей не поддерживается.)
Итак, я ищу способ иметь эти has_one
отношения, но не должен пропустить экземпляр при запросе.
Запрос должен быть простым, это то же самое, что и
# in LineItem
def review_item
review.find_by(meal_id: self.meal_id)
end
но, очевидно, я не могу предварительно загрузить это.
Я чувствую, что должен быть способ написать отношение has_one
, которое не принимает экземпляр LineItem
, но я изо всех сил пытаюсь его найти.