11

これは、何よりも Ruby の構文に関係している可能性があります。SomeObject.find で 2 つの制限条件を取得するのが困難です。

分離すると、条件はうまくいくようです:

if search != ''
  find(:all, :conditions => ['name LIKE ?', "%#{search}%"])
else
  find(:all, :conditions => ['active', 1]).shuffle
end

私が最初のケースのために行っているのはこれです:

find(:all, :conditions => ['name LIKE ?', "%#{search}%"], ['active', 1])

しかし、ラインはスローしsyntax error, unexpected ')', expecting tASSOCます。

4

4 に答える 4

17

レール 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?
于 2013-05-23T14:55:09.250 に答える
0

Rails 4 では、レールに新しい find_by と find_by! 方法が紹介されています

回答を読む

于 2016-01-31T06:47:28.280 に答える