Лучший способ переопределить named_scope для ассоциаций has_many в рельсах?

StackOverflow https://stackoverflow.com/questions/3723690

Вопрос

Примечание: я использую 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

И так далее...

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top