Frage

. Hinweis: Ich bin mit Rails 2.3.8, nicht 3

Ich habe ein Foto-Modell mit einem default_scope:

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

Beim photo_album.photos kehrt alle Fotos veröffentlicht geordnet nach Position, wie es sollte. Wenn jedoch in einem Admin-Panel durch diese Fotoalben Looping um die Anzahl der Fotos in jeder Anzeige, die Ergebnisse sind falsch:

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

0 zurück, da keine veröffentlicht werden.

Ich weiß, dass ähnliche Fragen gestellt wurden, und die Antwort ist in der Regel entlang der Linien von „eine with_exclusive_scope Klassenmethode verwenden“. Soweit ich das beurteilen kann, diese vollständig verhindert die Verwendung von Standard-Verbände Rails - grundsätzlich in etwa wie folgt resultierende:

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

und erfordert eine Klassenmethode wie:

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

nur die Gesamtzahl der Fotos in einem Album angezeigt werden soll. Das scheint verrückt - die Standardeinstellung überschreiben sollte nicht Rails Assoziation Konventionen erfordern verlassen. with_exclusive_scope kann nicht in einer Instanz-Methode (geschützte Methode) entweder verwendet werden - das wäre mir ein Photoalbum Instanz-Methode „all_photos“, um zumindest die Erhaltung der Anschein von Vereinigungen (photo_album.all_photos) genannt zu schaffen erlaubt haben. Aber nein, das ist nicht erlaubt: (

Neben Entfernen default_scopes, die sich über die Website sehr nützlich erwiesen haben, hat jemand weiß von einer Art und Weise überschreiben Standardbereiche und pflegen Rails Assoziation Syntax?

Danke!

Edit:

Ich zog ein Photoalbum Instanz-Methode hinzu, dass, während es nicht eine tatsächliche default_scope Überschreibung ist, hat bei make für viel schöner Syntax in meinen Ansichten:

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

Es ist zwar nicht gerade ein AR has_many Verein ist und es stützt sich auf reine SQL, es ist der beste Kompromiss ich bisher gefunden habe.

War es hilfreich?

Lösung 2

Für mich die beste Lösung in diesem Fall war weder default_scope noch has_many Bedingungen und nur Stick mit named_scopes zu verwenden. Zwei named_scopes erreicht das meiste, was ich brauchte, um meine Ansichten zu halten mager:

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

Andere Tipps

Ich verstehe nicht, warum Sie in Album nicht tun:

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

So kann man tun könnte:

@album.photos.count
@album.published_photos

Und so weiter ...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top