私はいくつかの基本的な検索を実装しており、複数の属性を 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.name
andと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
モデルの間には単純な関連付けがあります。