ユーザーが選択したタグを「すべて一致」させようとする方法を持つモデルがあります。ただし、アプリで 2 つのタグを選択し、パラメーターを以下のメソッドに渡すとすぐに、結果が返されません。1 つの選択で問題なく動作します。
ご覧のとおり、タグ付けによる多数のタグを持つスタイル モデルがあります。ユーザーが選択したタグを「すべて一致」させたいのですが、filter_with_params 定義の下の 3 行目は、適切なクエリを試行することです。
したがって、params[:t] = ["green", "yellow", "red"] を filter メソッドに渡すと、これら 3 つのタグすべてを持つスタイルのみを返したいとします。
モデルのスニペットを次に示します。
class Style < ActiveRecord::Base
has_many :tagizations, :dependent => :destroy
has_many :tags, :through => :tagizations
def self.filter_with_params(params)
scoped = self.where("styles.name != ''")
scoped = scoped.includes(:tags)
scoped = params[:t].inject(scoped){|memo, val| memo.where(:tags => {:name => val})} if params[:t]
scoped
end
end
以下は、2 つのリクエストの開発ログ出力を含む Gist です。
https://gist.github.com/jgrannas/6195528
.TO_SQL の使用
SINGLE TAG (作品):
Style.filter_with_params({:t => ["engagement"]}).to_sql
=> "SELECT \"styles\".* FROM \"styles\" WHERE \"tags\".\"name\" = 'engagement' AND (styles.name != '')"
複数のタグ (機能しません)
Style.filter_with_params({:t => ["engagement", "Halo"]}).to_sql
=> "SELECT \"styles\".* FROM \"styles\" WHERE \"tags\".\"name\" = 'engagement' AND \"tags\".\"name\" = 'Halo' AND (styles.name != '')
ポストグルを使用しています