9

ユーザー名、last_name、first_name のいずれかの文字列をチェックする単純な検索機能を実装しています。古い RailsCast でこの ActiveRecord メソッドを見たことがあります。

http://railscasts.com/episodes/37-simple-search-form

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

しかし、name、last_name、および first name でキーワードを検索し、フィールドの 1 つが用語と一致した場合にレコードを返すようにするにはどうすればよいでしょうか?

また、RailsCast のコードは SQL インジェクションを受けやすいのでしょうか?

どうもありがとう!

4

5 に答える 5

24

モデル名は Model であると想定しました。実際のクエリを実行するときに、実際のモデル名に置き換えてください。

Model.where("name LIKE ? OR last_name LIKE ? OR first_name LIKE ?", "%#{search}%","%#{search}%","%#{search}%")

SQL インジェクションに関する懸念について - どちらのコード スニペットも SQL インジェクションの影響を受けません。文字列を WHERE 句に直接埋め込まない限り問題ありません。インジェクションが発生しやすいコードの例は次のとおりです。

Model.where("name LIKE '#{params[:name]}'")
于 2012-08-05T13:48:26.967 に答える
13

選択した回答は機能しますが、「Raul Riera」という検索を入力しようとすると、検索が失敗することに気付きました。これは、Raul Riera が私の名前でも姓でもないため、どちらの場合でも失敗するためです。姓...私はそれを解決しました

Model.where("lower(first_name || ' ' || last_name) LIKE ?", "%#{search.downcase}%")
于 2014-04-10T00:10:13.790 に答える