我有一个模型,其方法是尝试“匹配所有”用户选择的标签。但是,一旦我在我的应用程序中选择了两个标签,并将参数传递给下面的方法,它就不会返回任何结果。一种选择效果很好。
如您所见,我有一个 Style 模型,它通过 Tagizations 具有_many 个标签。我想“匹配所有”用户选择的标签,我在 filter_with_params 定义下的第三行是我尝试正确查询。
因此,如果我将 params[:t] = ["green", "yellow", "red"] 传递给过滤器方法,我只想返回具有所有这三个标签的样式。
这是模型的一个片段:
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
这是一个 Gist,其中包含两个请求的开发日志输出:
https://gist.github.com/jgranas/6195528
使用 .TO_SQL
单标签(作品):
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 != '')
我正在使用 postgres