2

这一定很简单,但我被困住了......所以我将 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
4

1 回答 1

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}

当然,对于最后一个示例,您需要清理输入字段 - 以防止恶意用户篡改行为。

于 2013-02-16T12:22:26.620 回答