我新的rails和我想做一個選擇查詢基於不同的GET參數(過濾和排序)。我可以如何添加條件來查找代碼?基於params的動態ActiveRecord查找方法鏈接
例如:
if params[:ratings]
Movie.where(:rating => params[:ratings].keys)
end
,然後添加順序和其他地方的條件。我怎樣才能做到這一點?也許有更好的方法來精確地修改選擇查詢(不使用SQL字符串)。 謝謝。
我新的rails和我想做一個選擇查詢基於不同的GET參數(過濾和排序)。我可以如何添加條件來查找代碼?基於params的動態ActiveRecord查找方法鏈接
例如:
if params[:ratings]
Movie.where(:rating => params[:ratings].keys)
end
,然後添加順序和其他地方的條件。我怎樣才能做到這一點?也許有更好的方法來精確地修改選擇查詢(不使用SQL字符串)。 謝謝。
的where
,order
......方法返回的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
其實我建議has_scope gem對於這種類型的行爲。它允許您在模型上定義範圍和類方法,並自動將它們用於控制器中的過濾,排序等。
下面是從文檔的一個小例子,但有很多,你可以用它做:
class Graduation < ActiveRecord::Base
scope :featured, where(:featured => true)
end
class GraduationsController < ApplicationController
has_scope :featured, :type => :boolean
end
啊,天才。我一直在努力如何讓「開始」默認查詢,錯誤地調用「Movie.all」 - 這很簡單!爲了保持它的整潔,整潔,甚至可以用query = query.order(params [:some_order_param])將每個潛在的過濾器保留在一行上,如果params [:some_order_param]'。鐵軌是一種美麗和不斷的喜悅! – 2012-08-06 00:13:14