2

これは簡単なはずですが、行き詰まっています...だから、Mongoid で Rails#3 を使用していて、渡されたパラメーターに依存するクエリを動的に作成してから、 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のクエリ(Criteria)は連鎖可能であるため、これは機能します。


または、活用したいフィールドがもっとたくさんある場合は、次のようにすることができます。

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}

そして最後に、それをさらに1レベル進めて、フォームパラメータを適切にネストし、モデルと一致するようにパラメータに名前を付けて、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 に答える