2015-04-12 35 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) }