0

注意:我使用的是 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,但它是迄今为止我发现的最好的折衷方案。

4

2 回答 2

0

对我来说,在这种情况下最好的解决方案是既不使用 default_scope 也不使用 has_many 条件,只使用 named_scopes。两个 named_scope 完成了我保持视图精简所需的大部分工作:

named_scope :public_list, :conditions => ["published = ?", true], :order => :position
named_scope :private_list, :order => "created_at DESC"
于 2010-10-05T07:39:27.560 回答
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 回答