使用HABTM查找属于多个模型的记录

时间:2012-06-19 04:50:12

标签: ruby-on-rails

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(",")

感谢。

2 个答案:

答案 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