Как предварительно загрузить has_one через has_many в Rails 5.2? - PullRequest
0 голосов
/ 06 ноября 2018

Я ищу способ предварительно загрузить отношение 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, но я изо всех сил пытаюсь его найти.

1 Ответ

0 голосов
/ 06 ноября 2018

Ваше отношение должно иметь аргумент, потому что у вас нет прямой связи между LineItem и ReviewItem.

На самом деле в проблемной области клиент просматривает не Product в целом, а фактический экземпляр продукта, который был заказан и доставлен им (= LineItem), поэтому логично иметь:

class ReviewItem
  belongs_to :review
  belongs_to :line_item
  has_one :product, through: :line_item
  ...
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...