2012-08-05 52 views
3

我新的rails和我想做一個選擇查詢基於不同的GET參數(過濾和排序)。我可以如何添加條件來查找代碼?基於params的動態ActiveRecord查找方法鏈接

例如:

if params[:ratings] 
    Movie.where(:rating => params[:ratings].keys) 
end 

,然後添加順序和其他地方的條件。我怎樣才能做到這一點?也許有更好的方法來精確地修改選擇查詢(不使用SQL字符串)。 謝謝。

回答

4

whereorder ......方法返回的ActiveRecord ::關係的對象,這樣可以保持更多的調用查詢方法:

query = Movie 
if(params[:ratings]) 
    query = query.where(:rating => params[:ratings].keys) 
end 
if(params[:some_order_param]) 
    query = query.order(params[:some_order_param]) 
end 
# Keep adding more 'where', 'order', 'group', ... methods as needed ... 
results = query.all 
+0

啊,天才。我一直在努力如何讓「開始」默認查詢,錯誤地調用「Movie.all」 - 這很簡單!爲了保持它的整潔,整潔,甚至可以用query = query.order(params [:some_order_param])將每個潛在的過濾器保留在一行上,如果params [:some_order_param]'。鐵軌是一種美麗和不斷的喜悅! – 2012-08-06 00:13:14

3

其實我建議has_scope gem對於這種類型的行爲。它允許您在模型上定義範圍和類方法,並自動將它們用於控制器中的過濾,排序等。

下面是從文檔的一個小例子,但有很多,你可以用它做:

class Graduation < ActiveRecord::Base 
    scope :featured, where(:featured => true) 
end 

class GraduationsController < ApplicationController 
    has_scope :featured, :type => :boolean 
end