注:我使用的轨2.3.8,不是3.

我有一张照片模型与一default_scope:

default_scope :conditions => ["published = ?", true], :order => :position

叫photo_album.照片返回的所有出版照片,下令通过的位置,因为它应该。但是,在循环,通过这些照片专辑中的一个管理面板到显示器的照片数量在每,结果是错误的:

pluralize(photo_album.photos.count, "photo")

返回0,因为没有公布。

我知道类似的问题已要求,并回复通常是沿线的"使用with_exclusive_scope类方法"。我可以告诉,这完全禁止使用标准轨道协会-基本上产生这样的事情:

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

只是为了显示器总数的照片一张专辑。这似乎疯狂的-复盖默认不应要求放弃轨道协会的公约。with_exclusive_scope不能使用的一个实例法(保护的方法)可以-这将允许我以创建一个画册的实例的方法称为"all_photos"至少保留的假象协会联合会(photo_album.all_photos).但是,没有,就是不允许的:(

除了消除default_scopes,这已被证明非常有用的整个网站,没有人知道的一种方式复盖默认的范围和维护轨道协会法?

谢谢!

编辑:

我伤口上增加一个画册的方法的实例,虽然它不是一个实际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,这是最好的妥协,我已经找到为止。

有帮助吗?

解决方案 2

对我来说,最好的解决办法在这种情况是使用不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"

其他提示

我不明白为什么你不做专辑:

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

这样你可以这样做:

@album.photos.count
@album.published_photos

等等...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top