Der beste Weg, named_scope für has_many Verbände in Rails außer Kraft zu setzen?
-
03-10-2019 - |
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.
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 ...