2013-02-14 3 views
2

Это должно быть легко, но я застрял ... Так что я использую Rails # 3 с Mongoid и хочу динамически строить запрос, который будет зависеть от переданных параметров и , а затем выполнить find(). Что-то вродеMongoid dynamic query

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 выглядит примерно так:

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

ок, спасибо большое – xaxa

+0

Привет я сделал, как этот запроса = '' Params [: событие] .each сделать | ключ, значение | query + = "{# {key}: # {value.to_s}}," if value.present? end events = Event.or (query) Но он не работает в MONGOID ... можете ли вы помочь –