最佳方式复盖named_scope为has_many协会在轨道?
-
03-10-2019 - |
题
注:我使用的轨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
等等...
不隶属于 StackOverflow