2015-04-12 37 views
1

我注意到我的范围趋势,并试图找出如何使它干燥干涸的倍数与simialar作用域查询

scope :newest, -> { order('created_at DESC') } 
scope :top_sold, -> { order('qty_sold DESC') } 
scope :most_viewed, -> { order('qty_viewed DESC') } 
scope :most_downloaded, -> { order('qty_download DESC') } 
scope :most_favorited, -> { order('qty_favorited DESC') } 

我想在列传递我要整理,这样我可以在Photo上调用它。我试过这个,但遇到问题

scope :sort_photos, -> type { order('type DESC') } 
Photo.sort_photos('qty_download') 

我在正确的道路上还是有一个更聪明的方法来实现这一目标?

回答

1

通行证type作为范围参数和使用,在order子句与字符串内插:

scope :sort_photos,->(type) { order("#{type} DESC") } 

然后做:

Photo.sort_photos('qty_download') 
1

order方法以一个字符串或散列。例如,代替order('created_at DESC'),您可以执行order(created_at: :desc)。因此,要完成你想要的,这是因为改变,关键看你type变量简单:

scope :sort_photos, -> type { order(type => :desc) } 

我也建议使用定点为您order范围如by_。因此,范围by_sort_photos不会被后面定义的sort_photos方法或关联覆盖。

最后,拥有一个充满方法的公共接口是非常好的,而不需要知道类属性并将这些属性名称传递给公共接口方法。所以我会保留你拥有的许多不同的范围,但也许它们都指向我们在这里定义的范围。所以:

scope :newest, -> { by_most_recent_type('created_at') } 
scope :top_sold, -> { by_most_recent_type('qty_sold') } 

scope :by_most_recent_type, -> type { order(type => :desc) }