0

注:私は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に依存していますが、これまでに見つけた中で最高の妥協案です。

4

2 に答える 2

0

あなたがアルバムでやらない理由がわかりません:

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

このようにして、次のことができます。

@album.photos.count
@album.published_photos

等々...

于 2010-09-16T11:45:41.627 に答える
0

私にとって、この場合の最善の解決策は、default_scope条件もhas_many条件も使用せず、named_scopesを使用することでした。2つのnamed_scopesは、ビューをスリムに保つために必要なほとんどのことを実行しました。

named_scope :public_list, :conditions => ["published = ?", true], :order => :position
named_scope :private_list, :order => "created_at DESC"
于 2010-10-05T07:39:27.560 に答える