Область Rails с подсчетом отношений HABTM

#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' вместо этого сработало бы; Я просто выполнил быстрый поиск синтаксиса, но безуспешно. В любом случае, это основная идея.