如何在没有循环依赖的Thinking Sphinx的Rails 5中索引多态(STI)模型?

时间:2018-04-29 08:40:46

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

我正在使用rails 5.1.4Sphinx 2.2.11-id64-release (95ae9a6)

thinking_sphinx v 4.0.0应用程序整合简单的索引搜索

预期行为:

当我提交新搜索时,我希望看到一个空数组[]或一组搜索结果。

实际行为:

当我从视图层提交带有空参数的新搜索并尝试通过控制器操作中的binding.pry访问ThinkingSphinx :: Search对象时,rails会抛出{{ 1}}

ActionView::Template::Error (Circular dependency detected while autoloading constant StudentLesson)

代码段:

[1] pry(main)> ThinkingSphinx.search ''
=> [#<ThinkingSphinx::Search:0x2b0925399e10>
[2] pry(main)> _.inspect
RuntimeError: Circular dependency detected while autoloading constant StudentLesson
from /home/kf/.rvm/gems/ruby-2.4.3@crm/gems/activesupport-5.1.6/lib/active_support/dependencies.rb:509:in `load_missing_constant'
[3] pry(main)>
class Lesson < ApplicationRecord
  LESSON_TYPES = {
    'StudentLesson': StudentLesson,
    'ProfessionalLesson': ProfessionalLesson
  }.freeze
end

class StudentLesson < Lesson
  after_save ThinkingSphinx::RealTime.callback_for(:student_lesson)
end

class ProfessionalLesson < Lesson
  after_save ThinkingSphinx::RealTime.callback_for(:professional_lesson)
end
# app/indices/student_lesson_index.rb
ThinkingSphinx::Index.define :student_lesson, with: :real_time do
  indexes name, sortable: true
end

# app/indices/professional_lesson_index.rb
ThinkingSphinx::Index.define :professional_lesson, with: :real_time do
  indexes name, sortable: true
end
class SearchesController < ApplicationController
  def index
    @results = []
  end

  def create
    @results = ThinkingSphinx.search(params[:search])
    render :index
  end
end

这是<div class="collapse navbar-collapse" id="header-navbar"> <%= render 'layouts/nav_links' %> <%= form_for searches_path do %> <%= search_field_tag :search, params[:search] %> <%= submit_tag 'Search', name: nil, method: :get %> <% end %> </div>

dev.sphinx.conf

3 个答案:

答案 0 :(得分:2)

我认为这里的问题与Thinking Sphinx没有直接关系 - 它只是错误,因为它因模型中的循环依赖而无法加载搜索结果 - 特别是LESSON_TYPES常量:

  • 思考Sphinx进行搜索调用,在其结果集中至少有一个StudentLesson实例,因此需要加载该模型。
  • 正在加载StudentLessonLesson上找到它的依赖关系(作为子类)。
  • 正在加载LessonStudentLessonProfessionalLesson上找到它的依赖关系(作为对常量的引用)。
  • 因此,尝试再次加载StudentLesson,因此无限循环的依赖项。

(FWIW我刚刚在测试Rails应用程序中使用您提供的模型代码确认了此行为,没有涉及TS:我需要在控制台中运行所有StudentLesson.first。)

答案 1 :(得分:1)

你有2个类都继承了一个常量定义,这看起来有问题。

尝试将此常量定义移动到初始值设定项:

LESSON_TYPES = {
    'StudentLesson': StudentLesson,
    'ProfessionalLesson': ProfessionalLesson
  }.freeze

答案 2 :(得分:1)

解决方案实际上可以在评论主题中找到spring的仍然未解决的问题,该问题可以通过初始化require_dependency 'lesson' - &gt;来解决。我实际上已经在初始化程序中使用但将其移动到Rails.application.config.to_prepare块解决了重新加载问题以及与Sphinx相关的症状。