#ruby-on-rails #ruby #activerecord #scope #has-and-belongs-to-many
#ruby-on-rails #ruby #activerecord #область #имеет-и-принадлежит-многим
Вопрос:
У меня есть класс событий с отношениями HABTM с пользовательским классом. Я пытаюсь создать область событий, которая включает только события, с которыми связаны 2 пользователя.
В настоящее время у меня есть метод Event #status, который возвращает следующее:
def status
self.users.length == 2 ? "matched" : "not matched"
end
Итак, теперь в основном я пытаюсь найти, как написать область, которая включает в себя все «согласованные» события. Я пробовал scope :matched, self.users.length == 2
, что вообще не сработало, но есть ли аналогичный способ, которого мне не хватает?
РЕДАКТИРОВАТЬ: Этот метод класса выполняет это правильно, но все равно было бы неплохо, если бы я мог инкапсулировать его в область.
def self.pending
Event.all.map { |e| e if e.status == "matched" }
end
Ответ №1:
Здесь у вас есть несколько проблем. Прямо сейчас ваш status
метод возвращает литеральные строки, что немного удивительно — было бы более распространенным, если бы это возвращало логическое значение. Кроме того, название status
не является описательным — возможно, exactly_two_users?
было бы лучше. Кроме того, если вы используете users.count
вместо users.length
, то база данных будет выполнять подсчет более эффективно.
Я полагаю, что ваша область могла бы быть просто where(:users.count => 2)
.
Комментарии:
1. На самом деле я немного упростил метод, он должен возвращать три разных статуса.
where(:users.count => 2)
к сожалению, не сработало — в нем говорится, что для символа нет метода подсчета.2. Возможно,
'users.count'
вместо этого сработало бы; Я просто выполнил быстрый поиск синтаксиса, но безуспешно. В любом случае, это основная идея.