2012-06-19 58 views
0

我的音軌模型has_and_belongs_to_many:moods,:流派和:tempos(其中每一個同樣有has_and_belongs_to_many:音軌)。使用HABTM查找屬於多個模型的記錄

我試圖建立一個搜索「過濾器」,用戶可以在其中指定任何數量的流派,情緒和節奏,這將返回匹配任何條件從每個過濾程度的軌道。

示例查詢可能是

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

如果我建立符合所有這些類型的軌道的數組,我怎樣才能從陣列選擇那些屬於任何和所有的情緒則params的曲目,然後選擇從第二個數組中,所有的曲目也符合任何和所有的速度參數?

我建立與

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

其中genres = params[:genres].split(",")

由於最初的陣列。

回答

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 
0

我建議使用你的數據庫來實際執行這個查詢,因爲這樣會更加高效。

您可以嘗試先在SQL中加入所有這些表,然後使用條件查詢(即where子句首先嚐試它)。

一旦你成功了,你可以使用基於Active Record的方式編寫它。我認爲你首先在SQL中編寫它是相當重要的,這樣你才能正確理解正在發生的事情。

相關問題