注:私は3ではなくRails2.3.8を使用しています。
default_scopeの写真モデルがあります。
default_scope :conditions => ["published = ?", true], :order => :position
photo_album.photosを呼び出すと、公開されているすべての写真が位置順に返されます。ただし、管理パネルでこれらのフォトアルバムをループして、それぞれの写真の数を表示すると、結果は正しくありません。
pluralize(photo_album.photos.count, "photo")
公開されていないため、0を返します。
同様の質問がなされていることは知っていますが、回答は通常、「with_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
アルバム内の写真の総数を表示するだけです。これは非常識なようです。デフォルトをオーバーライドするために、Railsの関連付け規則を破棄する必要はありません。with_exclusive_scopeは、インスタンスメソッド(保護されたメソッド)でも使用できません。これにより、少なくとも関連付けの類似性(photo_album.all_photos)を保持するために、「all_photos」というPhotoAlbumインスタンスメソッドを作成できます。しかし、いいえ、それは許可されていません:(
サイト全体で非常に役立つことが証明されているdefault_scopesを削除する以外に、デフォルトのスコープをオーバーライドしてRailsの関連付け構文を維持する方法を知っている人はいますか?
ありがとう!
編集:
私は、実際のdefault_scopeオーバーライドではありませんが、私のビューではるかに優れた構文を作成するPhotoAlbumインスタンスメソッドを追加することになりました。
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")
これは正確にはARhas_manyアソシエーションではなく、純粋なSQLに依存していますが、これまでに見つけた中で最高の妥協案です。