私は次のようなことをしようとしています:
if filter_1
@field = @field.where()
else
@field = @field.where()
end
if filter_2
@field = @field.order()
end
etc.
@field
しかし、空のクエリで初期化するにはどうすればよいでしょうか? 私は試し@field = Field.all
ましたが、それは配列を与えるので連鎖を許可しません。
私は次のようなことをしようとしています:
if filter_1
@field = @field.where()
else
@field = @field.where()
end
if filter_2
@field = @field.order()
end
etc.
@field
しかし、空のクエリで初期化するにはどうすればよいでしょうか? 私は試し@field = Field.all
ましたが、それは配列を与えるので連鎖を許可しません。
scoped
モデルクラスで試してみてください。
@fields = Field.scoped
@fields = @fields.where("your conditions") if filter_1
@fields = @fiels.order("your conditions") if filter_2
@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(....)