0

私のトラック モデルには、:moods、:genres、および :tempos (それぞれ、同様に has_and_belongs_to_many :tracks) があります。

ユーザーが任意の数のジャンル、ムード、およびテンポを指定できる検索「フィルター」を構築しようとしています。これにより、各フィルタリングの程度から任意の条件に一致するトラックが返されます。

クエリの例は次のとおりです。

params[:genres] => "Rock, Pop, Punk"
params[:moods] => "Happy, Loud"
params[:tempos] => "Fast, Medium"

これらすべてのジャンルに一致するトラックの配列を作成する場合、その配列から任意のすべての気分パラメーターに属するトラックを選択し、その 2 番目の配列から任意のテンポにも一致するすべてのトラックを選択するにはどうすればよいですか?パラメータ?

私は初期配列を構築しています

@tracks = []
Genre.find_all_by_name(genres).each do |g|
  @tracks = @tracks | g.tracks
end

どこgenres = params[:genres].split(",")

ありがとう。

4

2 に答える 2

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 に答える
0

データベースを使用して実際にこのクエリを実行することをお勧めします。これははるかに効率的です。

最初にSQLでこれらすべてのテーブルを結合してから、条件付きクエリ、つまりwhere句を使用して最初に試してみることができます。

成功したら、Active Record ベースの方法で書き込むことができます。何が起こっているのかを正しく理解できるように、最初にSQLで書くことがかなり重要だと思います。

于 2012-06-19T06:03:32.290 に答える