0

Railsは初めてです。モデルオブジェクトとしてFooを使用した次のコードは次のとおりです。

a = Foo
a = Foo.where(age: 18)
if params[:sort] == "desc"
  a = a.order("name desc") 
end

ここでは2つのクエリが実行されます。それらを1つに結合するか、実行したいと言うことができます。 Foo.where(age=18).order("name asc")

順序が不要な場合、つまりparams [:sort]がdescと等しくない場合があることを忘れないでください。

次のような解決策を与えないでください

if params[:sort] == "desc"
    a = a.where(age=18).order("name desc") 
else
    a = a.where(age=18)
end

コードが冗長になり、パラメータが増えると機能しない可能性があるためです。

4

3 に答える 3

5

いいえ、あなたは間違っています。実際、ここではクエリは実行されません。

a = Foo
a = Foo.where(age=18)
if params[:sort] == "desc"
  a = a.order("name desc") 
end

実際のクエリは、データの取得を開始する場所に送信されます。つまり、次のようなことをします

a.each do |b|
  # do something with b
end

それまでは、基準構築メソッド(、、など)を安全に連鎖させることができwhereます。orderselect

于 2012-08-03T07:38:40.853 に答える
0

実際、コードは1つのクエリのみを実行します。これは、レールでは、データベースへの呼び出しは、結果にアクセスしたときにのみ実行されるためです。したがって、a.first(または同様のもの)を作成すると、DB呼び出しが行われます。

于 2012-08-03T07:39:27.173 に答える
0

それがあなたの言いたいことなら...簡単な解決策は次のようになります:

a.where(age: 18).order("name #{params[:sort] || 'asc'}")

したがって、そうであれば、params[:sort]デフォルトnilで。になりますasc

于 2012-08-03T07:39:58.467 に答える