レール 2
find(:all, :conditions => ['name LIKE ?', "%#{search}%"], ['active', 1])
メソッドにハッシュを渡すための適切な構文ではありません。メソッドの最後の引数である場合は、ハッシュから中括弧を省略できますが、この場合、最後の引数として配列を渡しています。
代わりに次を使用します。
find(:all, :conditions => ["name LIKE ? AND active = ?", "%#{search}%", 1])
また
params = {:search => "%#{search}%", :active => 1}
find(:all, :conditions => ["name LIKE :search AND active = :active", params])
レール 3 と 4
最近の Rails バージョンでは、おそらく次のようなことをしたいと思うでしょう:
scope :active, -> { where(active: true) }
scope :name_like, ->(search) { where("name LIKE ?", "%#{search}%") }
そして、次のように呼び出します。
YourModel.active.name_like("Bunnies")
これにより、アプリケーション全体でこれらの特定のクエリをさまざまな組み合わせで再利用できます。また、データを取得するコードが非常に読みやすくなります。
構文が気に入らない場合はscope
、これらをクラス メソッドとして定義することもできます。
def self.active
where(active: true)
end
def self.name_like(search)
where("name LIKE ?", "%#{search}%")
end
オンザフライでスコープをチェーンすることもできます。これにより、一連の関係オブジェクトの構築を開始し、条件に基づいて他のオブジェクトを含めることを選択できます。元の質問に適用して同じ結果を得ると、次のようになります。
results = active
results = results.name_like(search) if search.present?