2010-05-12 25 views
2

我正在使用ruby on rails和結果頁面調查應用程序我想讓用戶根據調查開始時提出的一系列人口統計問題篩選答案。如何過濾多個字段的結果?

例如,我問用戶他們的性別和職業是什麼。所以我正在考慮爲性別和職業而下降。這兩個下拉菜單都會默認爲全部,但如果用戶選擇了女性和營銷人員,那麼我的結果頁面只會從女性營銷人員那裏得到答案。

我認爲這樣做的正確方法是使用named_scopes,其中我的每個人口統計問題都有一個named_scope,在本示例中爲性別和職業,這將從下拉菜單中獲取已消毒的值以供在有條件,但我不確定如何動態創建named_scope鏈,因爲我有5個人口統計問題,可能其中一些將被設置爲全部。

回答

7

你可以連命名範圍在一起:

def index 
    @results = Results.scoped 
    @results = @results.gender(params[:gender]) unless params[:gender].blank? 
    @results = @results.career(params[:career]) unless params[:career].blank? 
end 

但我更喜歡使用has_scope寶石:如果您使用has_scopeinherited_resources

has_scope :gender 
has_scope :career 

def index 
    @results = apply_scopes(Results).all 
end 

,你甚至都不需要定義索引行動。

3
named_scope :gender,lambda { |*args| 
    unless args.first.blank? 
     { :conditions => [ "gender = ?", args.first] } 
    end 
    } 

如果以這種方式編寫命名範圍,你可以擁有所有這些鏈接,如果你則params的人會是空白不會斷裂。

Result.gender("Male") will return male results. 
Result.gender("") will return male and female too. 

而且你可以鏈接你所有的方法。最後,作爲一個篩選,你可以有這樣的:

Result.age(16).gender("male").career("beginer") 
Result.age(nil).gender("").career("advanced") - will return results with advanced career, etc. 
0

嘗試一些類似這樣的:

VistaFact.where(if active then {:field => :vista2} else {} end) 

或者這樣:

VistaFact.where(!data.blank? ? {:field=>data.strip} : {}).where(some? ? {:field2 => :data2} : {}).where ... 

這對我的工作很不錯!