Ruby on rails 使用相似查询干燥多个作用域
我注意到了我的示波器的一个趋势,并试图找出如何使其干燥Ruby on rails 使用相似查询干燥多个作用域,ruby-on-rails,ruby-on-rails-4,Ruby On Rails,Ruby On Rails 4,我注意到了我的示波器的一个趋势,并试图找出如何使其干燥 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
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') }
我想通过我想排序的专栏,以便我可以在照片上调用它。我试过了,但遇到了问题
scope :sort_photos, -> type { order('type DESC') }
Photo.sort_photos('qty_download')
我走的是正确的道路还是有更聪明的方法来实现这一点?将Pass
type
作为范围参数,并在order
子句中使用该参数和字符串插值:
scope :sort_photos,->(type) { order("#{type} DESC") }
然后做:
Photo.sort_photos('qty_download')
该方法采用字符串或哈希。例如,您可以执行order(created_at::DESC)
,而不是order('created_at DESC')
。因此,要实现您想要的功能,只需将键更改为类型
变量:
scope :sort_photos, -> type { order(type => :desc) }
我还建议为您的订单
范围使用哨兵,例如by
。这样,按照片排序的范围不会被以后的照片排序方法或关联的定义覆盖
最后,最好有一个充满方法的公共接口,而不是需要了解类属性并将这些属性名传递给公共接口方法。所以我会保留您拥有的许多不同的作用域,但可能会让它们都引用我们在这里定义的一个通用作用域。因此:
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) }