Лучший способ переопределить named_scope для ассоциаций has_many в рельсах?
-
03-10-2019 - |
Вопрос
Примечание: я использую Rails 2.3.8, а не 3.
У меня есть фото модель с default_scope:
default_scope :conditions => ["published = ?", true], :order => :position
Вызов photo_album.photos Возвращает все опубликованные фотографии, заказанные по позиции, как она должна. Однако, когда свяжитесь через эти фотоальбомы на панели администратора, чтобы отобразить количество фотографий в каждом, результаты неверны:
pluralize(photo_album.photos.count, "photo")
Возвращает 0, так как никто не публикуется.
Я знаю, что были спросины подобные вопросы, и ответ обычно находится вдоль линий «Использовать метод класса Clips_exclusive_scope». Насколько я могу сказать, это полностью предотвращает использование стандартных ассоциаций Rails - в основном в результате чего-то вроде этого:
pluralize(Photo.all_photos_in_album(photo_album.id).count, "photo")
и требует метода класса, как:
def Photo.all_photos_in_album(album_id)
self.with_exclusive_scope { find(:all, :conditions => ["photo_album_id = ?", album_id]) }
end
Просто для отображения общего количества фотографий в альбоме. Кажется, что безумно - переопределение по умолчанию не должно требовать отказ от ассоциаций рельсов. S_EXCLUBIVE_SCOPE нельзя использовать в методе экземпляра (защищенный метод). Но нет, это не допускается :(
Помимо удаления default_scopes, которые доказали очень полезное по всему сайту, знают ли кто-нибудь из способа переопределяют Scopes по умолчанию и поддерживает синтаксис ассоциации Rails?
Спасибо!
Редактировать:
Я завел добавление метода экземпляра Photoalbum, который, хотя он не является фактическим переопределением outeathe_scope, делает для того, чтобы сделать намного приятного синтаксиса в моих представлениях:
def all_photos_count
PhotoAlbum.count_by_sql("SELECT COUNT(id) FROM photos WHERE photo_album_id = #{self.id} ORDER BY created_at")
end
pluralize(photo_album.all_photos_count, "photo")
Пока это не совсем ассоциация AR HAS_MANY, и она полагается на чистое SQL, это лучший компромисс, который я нашел до сих пор.
Решение 2
Для меня лучшее решение в этом случае было использование ни по умолчанию_scope, ни HAS_MANY и просто придерживаться с Named_scopes. Два имени_Сокпис выполнили большую часть того, что мне нужно, чтобы мои взгляды были наклоны:
named_scope :public_list, :conditions => ["published = ?", true], :order => :position
named_scope :private_list, :order => "created_at DESC"
Другие советы
Я не понимаю, почему вы не делаете в альбоме:
has_many :photos
has_many :published_photos, :class_name => 'Photo', :conditions => ["published = ?", true], :order => :position
Таким образом, вы могли бы сделать:
@album.photos.count
@album.published_photos
И так далее...