Могу ли я: выбрать несколько полей (*, foo) без добавления дополнительных полей в мои экземпляры (Instance.foo => bar) - PullRequest
0 голосов
/ 22 февраля 2010

Я пытаюсь написать именованную область, которая упорядочит мой класс «Products» на основе среднего значения «Review». Базовая модель выглядит так

Product < ActiveRecord::Base
 has_many :reviews

Review < ActiveRecord::Base
  belongs_to :product
  # integer value

Я определил следующую именованную область действия в Product:

named_scope :best_reviews, 
 :select => "*, AVG(reviews.value) score", 
 :joins => "INNER JOIN (SELECT * FROM reviews GROUP BY reviews.product_id) reviews ON reviews.product_id = products.id", 
 :group => "reviews.product_id", 
 :order => "score desc"

Кажется, это работает правильно, за исключением того, что он добавляет значение «оценка» в выборке к моим экземплярам Продукта, что вызывает проблемы, если я пытаюсь их сохранить, и заставляет сравнения возвращать false (@BestProduct! = Product.best_reviews .first, потому что Product.best_reviews.first имеет оценку = что угодно).

Есть ли лучший способ структурировать named_scope? Или способ заставить Rails игнорировать дополнительное поле в select?

Ответы [ 2 ]

1 голос
/ 22 февраля 2010

Я не разработчик Rails, но я знаю, что SQL позволяет вам сортировать по полю, которого нет в списке выбора.

Можете ли вы сделать это:

:select => "*", 
:joins => "INNER JOIN (SELECT * FROM reviews GROUP BY reviews.product_id) reviews ON reviews.product_id = products.id", 
:group => "reviews.product_id", 
:order => "AVG(reviews.value) desc"
0 голосов
/ 22 февраля 2010

Ого, так что я действительно должен подождать, прежде чем задавать вопросы. Вот одно решение (я хотел бы услышать, если есть лучшие подходы):

Я переместил поле счета во внутреннее соединение. Это делает его доступным для заказа, но не добавляет его к экземпляру:

named_scope :best_reviews, 
 :joins => "INNER JOIN (
  SELECT *, AVG(value) score FROM reviews GROUP BY reviews.product_id
  ) reviews ON reviews.product_id = products.id", 
 :group => "reviews.product_id", 
 :order => "reviews.score desc"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...