レール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?
ありがとうございました!あなたの2番目の例は私のために働いた(最初の試みはしませんでした - 2番目の方法はいくつかの条件を追加する良い方法のように見えるので、あまり順序を心配する必要はありません)。 –