思考 - 使用belongs_to关联进行sphinx过滤

时间:2015-04-12 15:39:05

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

我有以下模型和索引来使用曲目标题和艺术家名称搜索曲目:

模型/ track.rb

class Track < ActiveRecord::Base
  include ThinkingSphinx::Scopes

  belongs_to :artist, :class_name => 'Fan', :foreign_key => 'fan_id'


  sphinx_scope(:of_fan) do |fan_id|
    {with: {fan_id: fan_id}}
  end

  def artist_name
    artist.name
  end
end

模型/ fan.rb

class Fan < User
  has_many :tracks
end

模型/ user.rb

class User < ActiveRecord::Base
  #Codes...
end

宝石清单:

gem 'rails', '4.1.0.rc1'
gem 'thinking-sphinx', '~> 3.1.3'

指数/ track_index.rb

ThinkingSphinx::Index.define :track, :with => :active_record, :delta => true do
  indexes title

  has plays_count, :as => :play_count
end

我尝试使用以下所有选项重建索引,但没有任何效果,并在此块下生成错误:

indexes artist(:first_name), :as => :artist_name
indexes artist.first_name, :as => :artist_name
indexes artist_name
indexes [artist.first_name, artist.last_name], :as => :artist_name

错误:

#For..
#indexes artist(:first_name), :as => :artist_name
#indexes artist.first_name, :as => :artist_name
ERROR: index 'track_delta': sql_range_query: ERROR:  syntax error at or near "AS"
LINE 1: ..."title" AS "title",  AS "author...
                                    ^
 (DSN=pgsql://username:***@localhost:5432/db_name).


#For - indexes [artist.first_name, artist.last_name], :as => :artist_name
rake aborted!
NoMethodError: undefined method `reflections' for nil:NilClass
/Users/morshedalam/.rvm/gems/ruby-2.0.0-p598/gems/joiner-0.2.0/lib/joiner/joins.rb:64:in `reflection_for'
/Users/morshedalam/.rvm/gems/ruby-2.0.0-p598/gems/joiner-0.2.0/lib/joiner/joins.rb:33:in `join_for'
/Users/morshedalam/.rvm/gems/ruby-2.0.0-p598/gems/joiner-0.2.0/lib/joiner/joins.rb:18:in `alias_for'
......

任何帮助都将不胜感激。

2 个答案:

答案 0 :(得分:1)

好的,我有解决方案。该问题与joiner gem update有关。将rails更新到4.1.0并将joiner gem添加到Gemfile解决了我的问题:

gem 'joiner', '~> 0.3.4'

后来,我收到了与协会问题相关的帖子:

Rails 4.1 - thinking-sphinx association not working

答案 1 :(得分:0)

这两项都应该有效:

indexes artist.first_name, :as => :artist_name
indexes [artist.first_name, artist.last_name], :as => :artist_name

但是这假设您的Fan模型中有first_name(和last_name)的列 - 是这种情况吗?

此外,您使用的是哪种版本的Thinking Sphinx和Rails?