Question

Note:. J'utilise Rails 2.3.8, pas 3

J'ai un modèle photo avec un default_scope:

default_scope :conditions => ["published = ?", true], :order => :position

Appel de déclarations photo_album.photos les photos publiées tous ordonné par la position comme il se doit. Cependant, lors de la boucle à travers ces albums photo dans un panneau d'administration pour afficher le nombre de photos dans chaque, les résultats sont erronés:

pluralize(photo_album.photos.count, "photo")

renvoie 0, comme aucun sont publiées.

Je sais que des questions similaires ont été posées, et la réponse est généralement le long des lignes de « utiliser une méthode de classe with_exclusive_scope ». Pour autant que je peux dire, cela empêche complètement l'utilisation des associations standards Rails - résultant essentiellement en quelque chose comme ceci:

pluralize(Photo.all_photos_in_album(photo_album.id).count, "photo")

et nécessitant une méthode de classe comme:

def Photo.all_photos_in_album(album_id)
  self.with_exclusive_scope { find(:all, :conditions => ["photo_album_id = ?", album_id]) }
end

juste pour afficher le nombre total de photos dans un album. Cela semble fou - remplaçant la valeur par défaut ne devrait pas exiger l'abandon de conventions d'association Rails. with_exclusive_scope ne peut pas être utilisé dans une méthode d'instance (méthode protégée) soit - cela me aurait permis de créer une méthode d'instance PhotoAlbum appelé « all_photos » à préserver au moins l'apparence d'associations (photo_album.all_photos). Mais non, ce n'est pas autorisé: (

En plus de la suppression default_scopes, qui se sont avérées très utiles sur le site, ce que quelqu'un sait d'une manière portées par défaut de priorité et maintenir la syntaxe d'association Rails?

Merci!

Modifier

J'ai fini par l'ajout d'une méthode d'instance PhotoAlbum que, si ce n'est pas un remplacement de default_scope réelle, fait à faire pour la syntaxe beaucoup plus agréable de mes vues:

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")

Bien que ce n'est pas exactement une association AR has_many et il repose sur SQL pur, il est le meilleur compromis que j'ai trouvé à ce jour.

Était-ce utile?

La solution 2

Pour moi, la meilleure solution dans ce cas est d'utiliser ni default_scope ni conditions has_many et juste bâton avec named_scopes. Deux named_scopes accompli la majeure partie de ce que je devais garder mon point de vue maigre:

named_scope :public_list, :conditions => ["published = ?", true], :order => :position
named_scope :private_list, :order => "created_at DESC"

Autres conseils

Je ne comprends pas pourquoi vous ne le faites pas dans l'album:

has_many :photos
has_many :published_photos, :class_name => 'Photo', :conditions => ["published = ?", true], :order => :position

De cette façon, vous pouvez faire:

@album.photos.count
@album.published_photos

Et ainsi de suite ...

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top