Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/53.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby on rails 使用相似查询干燥多个作用域_Ruby On Rails_Ruby On Rails 4 - Fatal编程技术网

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) }