My Track模型has_and_belongs_to_many:moods,:genres和:tempos(每个都同样has_and_belongs_to_many:track)。
我正在尝试构建一个搜索“过滤器”,用户可以在其中指定任意数量的流派,情绪和节奏,这些流派将返回与每个过滤程度的任何条件相匹配的曲目。
示例查询可能是
params[:genres] => "Rock, Pop, Punk"
params[:moods] => "Happy, Loud"
params[:tempos] => "Fast, Medium"
如果我构建了一个匹配所有类型的音轨数组,我如何从该数组中选择那些属于任何和所有情绪参数的音轨,然后从第二个数组中选择,所有音轨也匹配任何和所有音轨节奏参数?
我正在使用
构建初始数组@tracks = []
Genre.find_all_by_name(genres).each do |g|
@tracks = @tracks | g.tracks
end
其中genres = params[:genres].split(",")
感谢。
答案 0 :(得分:0)
我建议您使用数据库来实际执行此查询,因为这样会更有效率。
您可以先尝试在SQL中连接所有这些表,然后使用条件查询,即首先尝试使用的子句。
一旦成功,您可以基于Active Record的方式编写它。我认为你首先在SQL中编写它是非常重要的,这样你才能正确理解最新情况。
答案 1 :(得分:0)
最终工作
@tracks = []
Genre.find_all_by_name(genres).each do |g|
g.tracks.each do |t|
temptempos = []
tempartists = []
tempmoods = []
t.tempos.each do |m|
temptempos.push(m.name)
end
tempartists.push(t.artist)
t.moods.each do |m|
tempmoods.push(m.name)
end
if !(temptempos & tempos).empty? && !(tempartists & artists).empty? && !(tempmoods & moods).empty?
@tracks.push(t)
end
end
end
@tracks = @tracks.uniq