注意:我使用的是 Rails 2.3.8,而不是 3。
我有一个带有 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 也不能在实例方法(受保护的方法)中使用 - 这将允许我创建一个名为“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,但它是迄今为止我发现的最好的折衷方案。