Ruby on Rails: есть ли способ временно отключить полиморфные ассоциации? - PullRequest
1 голос
/ 17 мая 2011

У меня есть связь между моделями, которая является полиморфной.

Пример:

class Review
  belongs_to :review_subject, :polymorphic => true
end

Однако я хотел бы позвонить по этому вопросу:Ассоциация review_subject, где я знаю, что все результаты будут определенного типа.

В моем случае я хочу сделать это, чтобы я мог присоединиться к review_subject и затем наложить на него условие.В случае полиморфного отношения это обычно вызывает EagerLoadPolymorphicError.Логика этого в том, что он не может знать, какую модель загрузить для выполнения объединения, но это не применимо в моем случае, потому что я уже знаю, что в этот запрос будет вовлечена только одна модель.

Пример, в котором я знаю, что все соответствующие рецензии будут принадлежать_Книге, и я хочу показывать только рецензии, в которых есть авторы книг:

Review.joins(:review_subject)
      .where(review_subject_type => "Book")
      .where("reviewed.book_author IS NOT NULL")

Есть ли способвременно отключить полиморфные отношения?

Лучшее решение, которое я придумала, - добавить в модель Review вторую ассоциацию, belongs_to :review_subject_books_only, которая не является полиморфной и может вызываться только в этомситуация.Тем не менее, это уродливый хак как в модели, так и в том, что он также пропускает вызовы include, если только представления не ссылаются на review_subject_books_only обзора.

1 Ответ

1 голос
/ 07 июня 2011

Сделайте запрос наоборот:

Book.joins(:reviews).where('book_author is not null')
...