2014-01-05 2 views
0

Все еще чувствую свой путь вокруг AR (Rails 3.2). В моей user.rb модели, у меня есть этот кусок кода:Область для объединения в Rails?

def has_answered 
    self.quizzes.where(finished: true).count != 0 
    end 

В английском языке, я хотел бы, чтобы «проверить, является ли пользователь ответил на викторину».

Я хотел бы изменить его в область действия, что-то вроде scope :has_answered, includes(:quizzes).where("(finished: true). count > ?", 0). Я получаю синтаксические ошибки. У меня есть несколько вопросов:

  1. Действительно ли это лучше (чистота, гибкость и т. Д.).
  2. Могу ли я по-прежнему реорганизовать это, чтобы сделать его более чистым?
+0

Вы ищете готовые викторины, принадлежащие пользователю или пользователям, у которых есть завершенная викторина? – Jon

+0

Спасибо @Jon, пользователи, которые закончили викторину. Я должен ответить на двусмысленность, хотя –

ответ

0

В этой ситуации вы, вероятно, лучше всего либо реализации counter_cache для числа завершенных викторин пользователя, или просто добавить логическое поле для пользовательской модели что-то вроде has_completed_a_quiz.

Таким образом, вы легко сможете добавить область в пользовательскую модель, не требуя сканирования другой таблицы в БД, которая может стать большой таблицей/медленным запросом.

+0

Я согласен, я чувствую, что это дорого, когда «викторины» растут. Из двух, которые вы бы порекомендовали (являются ли 'counter_cache' более быстрыми, чем просто добавление логического или обратного? –

+0

Счетный кеш полезен, только если вам нужно знать, сколько викторин завершено пользователем. В противном случае просто перейдите к булевому поле. – Jon

Смежные вопросы