搜索与Rails和Thinking Sphinx的has_many关系

时间:2011-10-11 01:45:55

标签: ruby-on-rails-3 thinking-sphinx

我正在尝试使用Sphinx 0.9.10和Thinking Sphinx为我的Rails 3应用程序构建搜索功能。我希望用户搜索歌曲。我的歌可以有很多曲目。例如,歌曲“Beautiful song”,可以有一个链接到mp3的音轨,以及一个链接到youtube的视频轨道。

现在,当我只有一首歌曲与一首歌曲相关联时,我的搜索功能运作良好,但是当我有多首曲目时,我的搜索功能会出错......

我的用户应该能够输入关键字,并过滤以查找至少包含一个音轨,至少一个视频轨道或至少一个视频轨道的歌曲。

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

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

在我的Track模型中,我使用的是序列化媒体字段。 Ruby将其视为哈希,包含链接和类型(例如'audio / m4u'或'video / mp4')。 MySQL将其视为一个字符串。

class Track < ActiveRecord::Base
  belongs_to :Song

  serialize :media
end

在我的Song控制器中,我有类似的东西:

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

当我只有一首歌曲与歌曲相关联时,搜索结果就可以了。

但是当我有几首曲目时,似乎搜索索引只看到第一首曲目:如果“精美歌曲”有第一首曲目“视频”而第二首曲目“音频”,它只会在搜索结果中显示我在过滤器中选择“视频”,如果选择“音频”,则选择“否”。

我错过了什么?

1 个答案:

答案 0 :(得分:2)

您需要做的是与媒体列的连接值进行比较。在MySQL中,它看起来像这样:

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

或者对于PostgreSQL(使用8.4或更高版本 - 如果您使用的是旧版本,请告诉我们):

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