2013-02-14 70 views
2

這必須是一個容易的,但我卡... 所以我使用Rails#3與Mongoid,並希望動態生成查詢,將取決於傳遞的參數和然後執行查找()。 喜歡的東西Mongoid動態查詢

def select_posts 
    query = :all # pseudo-code here 
    if (params.has_key?(:author)) 
     query += where(:author => params[:author]) # this is pseudo-code again 
    end 

    if (params.has_key?(:post_date)) 
     query += where(:create_date => params[:post_date]) # stay with me 
    end 

    @post_bodies = [] 
    Post.find(query).each do |post| # last one 
     @post_bodies << post.body 
    end 

    respond_to do |format| 
     format.html 
     format.json { render :json => @post_bodies } 
    end 
end 

回答

5

您有幾種不同的選擇去與這裏 - 根據您的實際應用中是如何複雜會得到什麼。直接用你的例子 - 你可以用類似結束:

query = Post.all 
query = query.where(:author => params[:author]) if params.has_key?(:author) 
query = query.where(:create_date => params[:post_date]) if params.has_key?(:post_date) 
@post_bodies = query.map{|post| post.body} 

其中一期工程,因爲Mongoid查詢(標準)是可鏈接。


另外,如果你將有很多,你想利用更多的領域,你可以做到以下幾點:

query = Post.all 
fields = {:author => :author, :post_date => :create_date} 
fields.each do |params_field, model_field| 
    query = query.where(model_field => params[params_field]) if params.has_key?(params_field) 
end 
@post_bodies = query.map{|post| post.body} 

最後,你可以把它一個級別進一步並正確地嵌套您的表單參數,並命名參數以使它們與您的模型匹配,以便您的對象看起來像這樣:

params[:post] = {:author => "John Smith", :create_date => "1/1/1970", :another_field => "Lorem ipsum"} 

然後,你可以只是做:

@post_bodies = Post.where(params[:post]).map{|post| post.body} 

當然,與最後的例子,你要消毒輸入字段 - 防止惡意用戶使用行爲的篡改。

+0

ok了,非常感謝你 – xaxa 2013-02-16 22:53:18

+0

嗨 我不喜歡這樣 查詢= '' PARAMS [:事件]。每做|鍵,值| query + =「{#{key}:#{value.to_s}},」if value.present? 結束 events = Event.or(查詢) 但是在MONGOID中不工作...你能幫忙嗎 – 2014-06-26 07:11:15