Подтвердить что ты не робот

Rails 4: как использовать именованную область с ассоциациями has_many

В моем проекте Rails 4 (модель) has_many Видео (модель). У меня есть именованная область в модели видео:

scope :live, where( is_deleted: 0, sent_to_api: 1 )

В одном из моих проектных представлений я делаю это (проект является экземпляром проекта):

project.videos.live.size

То, что я ожидаю получить, - это количество проектов в этом конкретном проекте, но вместо этого я получаю количество видео в любом проекте. Это как будто .live не возвращает подмножество из .videos, а скорее заменяет его.

Я вижу, что здесь объясняется , что привязка названных областей друг к другу должна сочетаться с логическим И, но когда применяется к "методу ассоциации" [< - not конечно, правильная терминология для .videos в этом контексте], которая, похоже, не происходит.

Каков правильный способ сделать это?

4b9b3361

Ответ 1

Я считаю, что в Rails 4 это должно выглядеть так:

scope :live, -> { where(is_deleted: 0, sent_to_api: 1) }

Рельсы 4 документа и все примеры в нем показывают, что вы передаете вызываемый объект в область, чтобы гарантировать, что она будет вызвана каждый раз. Если это не работает, попробуйте реализовать его как метод класса и посмотрите, как это работает для вас.

http://api.rubyonrails.org/classes/ActiveRecord/Scoping/Named/ClassMethods.html

Ответ 2

Я бы просто пошел на методы класса и оставил области позади. Синтаксис намного проще, потому что он похож на любой другой метод класса, включая передачу ему параметров.

Try:

def self.live
  where( is_deleted: 0, sent_to_api: 1 )
end

И затем:

project.videos.live.size

и посмотрите, помогает ли она.

Для получения дополнительной информации прочитайте здесь.