0

我的 Track 模型 has_and_belongs_to_many :moods、:genres 和 :tempos (每一个同样有 has_and_belongs_to_many :tracks)。

我正在尝试构建一个搜索“过滤器”,用户可以在其中指定任意数量的流派、情绪和节奏,这将返回匹配每个过滤程度的任何条件的曲目。

一个示例查询可能是

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

谢谢。

4

2 回答 2

0

我建议使用您的数据库来实际执行此查询,因为这样会更有效率。

您可以先尝试在 SQL 中连接所有这些表,然后使用条件查询(即 where 子句)首先尝试一下。

一旦成功,您就可以以基于 Active Record 的方式编写它。我认为你首先用 SQL 编写它是相当重要的,这样你才能正确理解发生了什么。

于 2012-06-19T06:03:32.290 回答
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
于 2012-06-19T14:18:30.437 回答