注意:我使用的是Rails 2.3.8,而不是3。
我有一个带有default_scope的Photo模型:
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也不能在实例方法(受保护的方法)中使用 - 这将允许我创建一个名为“all_photos”的PhotoAlbum实例方法,以至少保留关联的外观(photo_album.all_photos)。但不,这是不允许的:(
除了删除已证明在整个站点非常有用的default_scopes之外,是否有人知道覆盖默认范围的方法并维护Rails关联语法?
谢谢!
修改:
我最后添加了一个PhotoAlbum实例方法,虽然它不是一个真正的default_scope覆盖,但是在我的视图中做了更好的语法:
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")
虽然它不完全是AR has_many关联,它依赖于纯SQL,但它是迄今为止我发现的最佳折衷方案。
答案 0 :(得分:0)
我不明白你为什么不在专辑中这样做:
has_many :photos
has_many :published_photos, :class_name => 'Photo', :conditions => ["published = ?", true], :order => :position
这样你就可以:
@album.photos.count
@album.published_photos
等等......
答案 1 :(得分:0)
对我来说,在这种情况下,最好的解决方案是既不使用default_scope也不使用has_many条件,只是坚持使用named_scopes。两个named_scopes完成了我所需要的大部分工作,以保持我的观点精益:
named_scope :public_list, :conditions => ["published = ?", true], :order => :position
named_scope :private_list, :order => "created_at DESC"