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
в этом контексте], которая, похоже, не происходит.
Каков правильный способ сделать это?
Ответы
Ответ 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
и посмотрите, помогает ли она.
Для получения дополнительной информации прочитайте здесь.