0

私は次のようなことをしようとしています:

if filter_1
  @field = @field.where()
else
  @field = @field.where()
end

if filter_2
  @field = @field.order()
end

etc.

@fieldしかし、空のクエリで初期化するにはどうすればよいでしょうか? 私は試し@field = Field.allましたが、それは配列を与えるので連鎖を許可しません。

4

2 に答える 2

2

scopedモデルクラスで試してみてください。

@fields =  Field.scoped
@fields = @fields.where("your conditions") if filter_1
@fields = @fiels.order("your conditions") if filter_2
于 2012-09-10T08:08:22.817 に答える
1

@field インスタンス変数を初めて初期化する場合は、クラス Field を参照してみてください。

フィルタ 1:@field = Field.where(...)

その後、さらにフィルターを追加し続ける必要がある場合は、変数フィールドを何度でも参照できます。

Filter2 以降:@field = @field.where(...)

Filter1 はアクティブな Record リレーションを返すため、さらに条件句をネストできます。また、SQL は実際に必要になったときにのみ生成および処理されるため、パフォーマンスの問題についても心配する必要はありません (遅延読み込み)。

フィルターの最後で @field.to_sql を実行すると、すべての where 句が便利に 1 つの SQL ステートメントに入れ子になっていることがわかります。

また、 Active Record Query Interfaceを読むことをお勧めします

編集

メソッド get_field を作成します。そして、それを使用してフィルター結果を追加します。

def get_field(field)  
  @field.is_a?(ActiveRecord::Relation) ? Field : field
end


get_field(@field).where(....) 
get_field(@field).where(....)
于 2012-09-10T08:16:28.380 に答える