这一定是一件容易的事,但我被困住了...... 因此,我将 Rails#3 与 Mongoid 结合使用,并希望动态构建依赖于传递的参数的查询,然后然后执行 find()。 类似的东西
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
最佳答案
这里有几个不同的选项可供选择 - 取决于您的实际应用程序的复杂程度。直接使用您的示例 - 您最终可能会得到类似的结果:
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}
当然,对于最后一个示例,您需要清理输入字段 - 以防止恶意用户篡改行为。
关于ruby-on-rails-3 - Mongoid动态查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14876970/