0

私はいくつかの基本的な検索を実装しており、複数の属性を 1 セットのキーワードに一致させようとしています。

私はこれを持っています:

listings = Listing.order(:headline)
listings = listings.where("headline like ?", "%#{keywords}%") if keywords.present?

listingsが表示されるかどうかを確認したいという複数の属性がありますkeywords-たとえば、listing.neighborhood.nameまたはlisting.type.name.

それをすべて1つのステートメントに書くにはどうすればよいですか? 私は試した:

listings = listings.where("headline like ? or neighborhood.name like ?", "%#{keywords}%")

しかし、それはこのエラーを返しました:

ActiveRecord::PreparedStatementInvalid: wrong number of bind variables (1 for 2) in: headline like ? or neighborhood.name like ?

明らかな解決策の 1 つは、もう一度追加すること"%#{keywords}%"です...しかし、それは DRY とは思えません。

その1つのクエリでneighborhood.nameandとother の両方をチェックするにはどうすればよいですか? type.nameまたは、これに別の方法でアプローチする必要がありますか?

ありがとう。

編集1:

{keywords}別のパラメーターを追加するだけの非 DRY 方法を試すと、次のエラーが表示されます。

ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: neighborhood.name: SELECT "listings".* FROM "listings"  WHERE (headline like '%sterling place%') AND (headline like '%sterling place%' or neighborhood.name like '%sterling place%') ORDER BY headline.

これneighborhoodは、私のモデルのforeign_keylistingsであり、それ自体が属性ではないためだと思います。listings&neighborhoodモデルの間には単純な関連付けがあります。

4

3 に答える 3

2

これを試してください(まだDRYではない方法です):

key = "%#{keywords}%"
listings = Listing.includes(:neighborhood).where("headline like ? or neighborhoods.name like ?", key, key)
于 2013-02-11T12:51:17.067 に答える
2

DRYにするオプションはあまりないと思います...しかし、次のようなことができます:

listings = listings.where("headline like :keywords or neighborhood.name like :keywords", :keywords => "%#{keywords}%")

編集:関連付けに気づきませんでした... siekfriedは正しいです...列を追加し始めると、もう少しDRYになります:

listings = Listing.includes(:neighborhood).where("listings.headline like :keywords or neighborhoods.name like :keywords", :keywords => "%#{keywords}%")
于 2013-02-11T13:10:41.237 に答える
1

試す:

listings = listings.where("headline like ? or neighborhood.name like ?", "%#{keywords}%", "%#{keywords}%")
于 2013-02-11T12:56:59.250 に答える