【问题标题】:Rails 4.1 and Thinking Sphinx - undefined method 'parent' for ActiveRecord::Associations::JoinDependency::JoinAssociationRails 4.1 和 Thinking Sphinx - ActiveRecord::Associations::JoinDependency::JoinAssociation 的未定义方法“父”
【发布时间】:2014-06-09 08:06:05
【问题描述】:

我开始将Rails 4.0 应用升级到Rails 4.1。应用程序使用了很多宝石,Thinking Sphinx 就是其中之一。我在 Rails 4.1 升级后重新安装了thinking-sphinx gem(以启用正确版本的连接器,现在是3.0)。但是现在当我尝试重建索引时,我会收到来自 TS 的奇怪错误:

$ rake ts:rebuild --trace
** Invoke ts:rebuild (first_time)
** Invoke ts:stop (first_time)
** Invoke environment (first_time)
** Execute environment
** Execute ts:stop
searchd is not currently running.
Stopped searchd daemon (pid: ).
** Invoke ts:index (first_time)
** Invoke environment 
** Execute ts:index
Generating configuration to /Users/serj/Projects/project/config/development.sphinx.conf
rake aborted!
NoMethodError: undefined method `parent' for #<ActiveRecord::Associations::JoinDependency::JoinAssociation:0x007ff438543678>
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/thinking-sphinx-3.1.1/lib/thinking_sphinx/active_record/filtered_reflection.rb:40:in `block in scope'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency/join_association.rb:52:in `instance_exec'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency/join_association.rb:52:in `block (2 levels) in join_constraints'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency/join_association.rb:48:in `map'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency/join_association.rb:48:in `block in join_constraints'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency/join_association.rb:33:in `reverse_each'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency/join_association.rb:33:in `join_constraints'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:161:in `make_constraints'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:167:in `make_outer_joins'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:169:in `block in make_outer_joins'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:169:in `each'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:169:in `flat_map'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:169:in `make_outer_joins'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:205:in `block in walk'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:205:in `each'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:205:in `flat_map'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:205:in `walk'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:114:in `block in join_constraints'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:112:in `each'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:112:in `flat_map'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/associations/join_dependency.rb:112:in `join_constraints'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/relation/query_methods.rb:985:in `build_joins'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/relation/query_methods.rb:838:in `build_arel'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/relation/query_methods.rb:830:in `arel'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/activerecord-4.1.1/lib/active_record/relation.rb:520:in `to_sql'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/thinking-sphinx-3.1.1/lib/thinking_sphinx/active_record/sql_builder.rb:11:in `sql_query'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/thinking-sphinx-3.1.1/lib/thinking_sphinx/active_record/sql_source.rb:119:in `build_sql_query'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/thinking-sphinx-3.1.1/lib/thinking_sphinx/active_record/sql_source.rb:136:in `prepare_for_render'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/thinking-sphinx-3.1.1/lib/thinking_sphinx/active_record/sql_source.rb:65:in `render'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/riddle-1.5.11/lib/riddle/configuration/index.rb:29:in `block in render'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/riddle-1.5.11/lib/riddle/configuration/index.rb:29:in `collect'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/riddle-1.5.11/lib/riddle/configuration/index.rb:29:in `render'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/thinking-sphinx-3.1.1/lib/thinking_sphinx/core/index.rb:53:in `render'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/riddle-1.5.11/lib/riddle/configuration.rb:43:in `block in render'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/riddle-1.5.11/lib/riddle/configuration.rb:43:in `collect'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/riddle-1.5.11/lib/riddle/configuration.rb:43:in `render'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/thinking-sphinx-3.1.1/lib/thinking_sphinx/configuration.rb:90:in `render'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/thinking-sphinx-3.1.1/lib/thinking_sphinx/configuration.rb:96:in `block in render_to_file'
/Users/serj/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/open-uri.rb:36:in `open'
/Users/serj/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/open-uri.rb:36:in `open'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/thinking-sphinx-3.1.1/lib/thinking_sphinx/configuration.rb:96:in `render_to_file'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/thinking-sphinx-3.1.1/lib/thinking_sphinx/rake_interface.rb:13:in `configure'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/thinking-sphinx-3.1.1/lib/thinking_sphinx/rake_interface.rb:24:in `index'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/thinking-sphinx-3.1.1/lib/thinking_sphinx/tasks.rb:9:in `block (2 levels) in <top (required)>'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/task.rb:240:in `call'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/task.rb:240:in `block in execute'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/task.rb:235:in `each'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/task.rb:235:in `execute'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/task.rb:179:in `block in invoke_with_call_chain'
/Users/serj/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/task.rb:172:in `invoke_with_call_chain'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/task.rb:201:in `block in invoke_prerequisites'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/task.rb:199:in `each'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/task.rb:199:in `invoke_prerequisites'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/task.rb:178:in `block in invoke_with_call_chain'
/Users/serj/.rvm/rubies/ruby-2.0.0-p353/lib/ruby/2.0.0/monitor.rb:211:in `mon_synchronize'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/task.rb:172:in `invoke_with_call_chain'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/task.rb:165:in `invoke'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/application.rb:150:in `invoke_task'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/application.rb:106:in `block (2 levels) in top_level'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/application.rb:106:in `each'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/application.rb:106:in `block in top_level'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/application.rb:115:in `run_with_threads'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/application.rb:100:in `top_level'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/application.rb:78:in `block in run'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/application.rb:176:in `standard_exception_handling'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/lib/rake/application.rb:75:in `run'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/gems/rake-10.3.2/bin/rake:33:in `<top (required)>'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/bin/rake:23:in `load'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/bin/rake:23:in `<main>'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/bin/ruby_executable_hooks:15:in `eval'
/Users/serj/.rvm/gems/ruby-2.0.0-p353@project/bin/ruby_executable_hooks:15:in `<main>'
Tasks: TOP => ts:rebuild => ts:index

宝石文件

source 'http://rubygems.org'

gem 'rails', '4.1.0'

# Sphinx.
gem 'mysql2',          '0.3.13', platform: :ruby
gem 'thinking-sphinx', '~> 3.1.1'

# ...

thinking_sphinx.yml

development: &defaults
  morphology: stem_enru, Soundex, Metaphone
  enable_star: 1
  expand_keywords: 1
  min_infix_len: 2
  max_matches: 500000

test:
  mysql41: <%= ENV['TEST_ENV_NUMBER'].to_i + 9307 %>
  pid_file: <%= File.join(Rails.root, "tmp", "searchd.#{ENV['TEST_ENV_NUMBER']}.pid") %>
  indices_location: <%= File.join(Rails.root, "db", "sphinx", "#{ENV['TEST_ENV_NUMBER']}") %>
  configuration_file: <%= File.join(Rails.root, "config", "test.#{ENV['TEST_ENV_NUMBER']}.sphinx.conf") %>
  binlog_path: <%= File.join(Rails.root, "db", "sphinx", "#{ENV['TEST_ENV_NUMBER']}", "binlog") %>
  <<: *defaults

补充资料:

  • Rails 4.1
  • Sphinx 2.1.4 版本 (rel21-r4421)
  • thinking-sphinx 3.1.1
  • mysql2 0.3.16(狮身人面像)
  • pg 0.17.1(这是我的主数据库)

任何想法如何处理?我无法升级到新的 Rails,因为该项目使用 TS 非常重。

【问题讨论】:

    标签: ruby-on-rails activerecord thinking-sphinx ruby-on-rails-4.1


    【解决方案1】:

    好的,Thinking Sphinx 和 Rails 4.1 存在问题。当您使用 Rails 4.1 时,Thinking Sphinx 中的多态关联被破坏(因为 ActiveRecord 中发生了很多变化)。这是我打开的问题:https://github.com/pat/thinking-sphinx/issues/783

    就我而言,我刚刚从多态关联迁移,因为我希望能够完全升级到 Rails 4.1。

    UPD:Pat 解决了这个问题,现在应该可以了。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-11-18
      • 2014-04-26
      • 1970-01-01
      • 2017-06-06
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多