2011-10-11 133 views
1

我正在嘗試爲獅身人面像0.9.10和思維獅身人面像的我的Rails 3應用程序構建搜索功能。我希望用戶搜索歌曲。我的歌可以有很多曲目。例如,歌曲「美麗的歌曲」,可以有一個音頻鏈接到一個MP3,和一個視頻軌道鏈接到YouTube。搜索has_many與Rails和思維獅身人面像的關係

現在,我的搜索功能運作良好時,我有相關的歌曲只有1條賽道,但越野車,當我有幾條軌道...

我的用戶應該能夠輸入關鍵字,並過濾以查找具有至少一個音頻軌道,至少一個視頻軌道或每個至少一個的歌曲。

到目前爲止,我有我的歌以下模型:

class Song < ActiveRecord::Base 
    ... 
    has_many :tracks 
    ... 

    define_index('song') do 
    indexes        :name, 
              :sortable => :true 
    has  "tracks.media LIKE '%audio%'",:as   => :audio, 
              :type  => :boolean 
    has  "tracks.media LIKE '%video%'",:as   => :video, 
              :type  => :boolean 
    end 
end 

在我的跟蹤模型中,我使用的是序列化媒體領域。 Ruby認爲它是一個散列,其中包含一個鏈接和一個類型(例如'audio/m4u'或'video/mp4')。 MySQL將它視爲一個字符串。

class Track < ActiveRecord::Base 
    belongs_to :Song 

    serialize :media 
end 

在我的歌控制器,我有這樣的事情:

class CoursesController < ApplicationController 
    def search 
     with_params[:audio] = true if search[:audio] == true || search[:audio] == 'true' || search[:audio] == "1" 
     with_params[:video] = true if search[:video] == true || search[:video] == 'true' || search[:video] == "1" 

     @songs = Song.search(
     keywords, 
     :with  => with_params 
     ... 
    ) 
     ... 
    end 
end 

搜索結果都很好,當我有關聯的歌曲只有一首曲目。

但是,當我有幾個軌道,似乎搜索索引只看到第一首曲目:如果「美麗的歌曲」有第一個軌道「視頻」,第二個「音頻」,它只會顯示在搜索結果如果我在我的過濾器中選擇「視頻」,如果選擇「音頻」則不顯示。

我錯過了什麼?

回答

2

您需要做的是與媒體列的連接值進行比較。在MySQL中,那將是這個樣子:

GROUP_CONCAT(`tracks`.`media` SEPARATOR ' ') 

或者對PostgreSQL(使用8.4或更好 - 讓我知道,如果你使用的是舊版本):

array_to_string(array_agg("tracks"."media"), ' ') 
+0

感謝帕特!我將如何做一個OR語句而不是AND? (現在,如果我同時檢查「音頻」和「視頻」,它會返回具有音頻和視頻軌道的歌曲,但我希望具有音頻和/或視頻軌道的歌曲) – alex

+0

我只需添加另一個屬性即可檢查連接結果是LIKE無論是視頻還是音頻。雖然有一個純粹的獅身人面像方法:http://freelancing-god.github.com/ts/en/common_issues.html#or_attributes – pat

+0

完美!我創建了一個新的屬性......它適合我當前的代碼。 – alex