Domanda

. Nota: sto usando Rails 2.3.8, non 3

Ho un modello Foto con un default_scope:

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

Calling photo_album.photos restituisce tutte le foto pubblicate in ordine di posizione come dovrebbe. Tuttavia, quando il ciclo attraverso questi album fotografici in un pannello di amministrazione per visualizzare il numero di foto in ciascuna, i risultati sono sbagliati:

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

restituisce 0, in quanto nessuno vengono pubblicati.

So che simili questioni sono state poste, e la risposta è in genere lungo le linee di "utilizzare un metodo di classe with_exclusive_scope". Per quanto posso dire, questo impedisce completamente l'uso di associazioni guide standard - in sostanza con conseguente qualcosa di simile:

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

e che richiedono un metodo di classe come:

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

solo per visualizzare il numero totale di foto in un album. Questo sembra folle - sovrascrivendo il default non dovrebbe richiedere l'abbandono Rails convenzioni di associazione. with_exclusive_scope non può essere utilizzato in un metodo di istanza (metodo protetto) - che questo mi avrebbe permesso di creare un metodo di istanza PhotoAlbum chiamato "all_photos" per almeno conservano le sembianze di associazioni (photo_album.all_photos). Ma no, non è consentito: (

Oltre a rimuovere default_scopes, che hanno dimostrato molto utile in tutto il sito, qualcuno sa di un modo ambiti di esclusione predefiniti e mantenere Rails sintassi associazione?

Grazie!

Modifica

Finii per l'aggiunta di un metodo di istanza PhotoAlbum che, mentre non è un override default_scope vero e proprio, non a rendere più bello per la sintassi molto nel mio punto di vista:

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

Anche se non è esattamente un'associazione AR has_many e si basa sulla pura SQL, è il miglior compromesso che ho trovato finora.

È stato utile?

Soluzione 2

Per me, la soluzione migliore in questo caso è stato quello di utilizzare né default_scope né condizioni has_many e solo bastone con named_scopes. Due named_scopes compiuto la maggior parte di quello che mi serviva per mantenere le mie opinioni magra:

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

Altri suggerimenti

Non capisco il motivo per cui non si fa in Album:

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

In questo modo si potrebbe fare:

@album.photos.count
@album.published_photos

E così via ...

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top