PgSearch 1.0.0 выдает ошибку ModelNotMultisearchable при попытке перестроения из консоли

У меня есть приложение с 4 разными моделями, которые поддерживают множественный поиск, однако изначально они были настроены с помощью pg_search_scope; то есть:

class Episode < ActiveRecord::Base
  include PgSearch
  # multisearchable :against => [:title, :description]

  pg_search_scope :search_text,
    :against => [:title, :description],
    :using => {
               :tsearch => {:prefix => true}
              }

Как вы можете видеть, в какой-то момент я попытался настроить это с помощью множественного поиска.

В последнее время есть элементы, которые, как мы знаем, должны возвращаться, которых НЕТ в результатах поиска, и я подумал, что мне придется перестроить pg_search_documents; однако это вызывает ошибку:

irb(main):004:0> PgSearch::Multisearch.rebuild(Show)
PgSearch::Multisearch::ModelNotMultisearchable: PgSearch::Multisearch::ModelNotMultisearchable
    from /app/vendor/bundle/ruby/2.0.0/gems/pg_search-0.7.3/lib/pg_search/multisearch/rebuilder.rb:6:in `initialize'
    from /app/vendor/bundle/ruby/2.0.0/gems/pg_search-0.7.3/lib/pg_search/multisearch.rb:10:in `new'
    from /app/vendor/bundle/ruby/2.0.0/gems/pg_search-0.7.3/lib/pg_search/multisearch.rb:10:in `block in rebuild'
    from /app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.2/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in `block in transaction'
    from /app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.2/lib/active_record/connection_adapters/abstract/database_statements.rb:210:in `within_new_transaction'
    from /app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.2/lib/active_record/connection_adapters/abstract/database_statements.rb:202:in `transaction'
    from /app/vendor/bundle/ruby/2.0.0/gems/activerecord-4.0.2/lib/active_record/transactions.rb:209:in `transaction'
    from /app/vendor/bundle/ruby/2.0.0/gems/pg_search-0.7.3/lib/pg_search/multisearch.rb:8:in `rebuild'
    from (irb):4
    from /app/vendor/bundle/ruby/2.0.0/gems/railties-4.0.2/lib/rails/commands/console.rb:90:in `start'
    from /app/vendor/bundle/ruby/2.0.0/gems/railties-4.0.2/lib/rails/commands/console.rb:9:in `start'
    from /app/vendor/bundle/ruby/2.0.0/gems/railties-4.0.2/lib/rails/commands.rb:62:in `<top (required)>'
    from /app/bin/rails:4:in `require'
    from /app/bin/rails:4:in `<main>'
irb(main):005:0> 

Я подумал, что это может быть из-за настройки как pg_search_scope, поэтому я установил один класс, как указано выше, с multisearch:multisearchable :against => [:title, :description] - но даже тогда у меня возникают проблемы с перестроением.

Я попробовал ручной способ удаления из таблицы pg_search и перестроения, но даже ЭТО выдает ошибку:

2.1.0 :010 > Show.find_each{ |record| record.update_pg_search_document }
  Show Load (4.8ms)  SELECT "shows".* FROM "shows" ORDER BY "shows"."id" ASC LIMIT 1000
NoMethodError: undefined method `update_pg_search_document' for #<Show:0x007fd945a92358>
    from /Users/grimm/.rvm/gems/ruby-2.1.0/gems/activemodel-4.0.2/lib/active_model/attribute_methods.rb:439:in `method_missing'
    from /Users/grimm/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.2/lib/active_record/attribute_methods.rb:155:in `method_missing'
    from /Users/grimm/.rvm/gems/ruby-2.1.0/gems/acts_as_follower-0.2.1/lib/acts_as_follower/followable.rb:54:in `method_missing'
    from (irb):10:in `block in irb_binding'
    from /Users/grimm/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.2/lib/active_record/relation/batches.rb:26:in `block (2 levels) in find_each'
    from /Users/grimm/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.2/lib/active_record/relation/batches.rb:26:in `each'
    from /Users/grimm/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.2/lib/active_record/relation/batches.rb:26:in `block in find_each'
    from /Users/grimm/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.2/lib/active_record/relation/batches.rb:75:in `find_in_batches'
    from /Users/grimm/.rvm/gems/ruby-2.1.0/gems/activerecord-deprecated_finders-1.0.3/lib/active_record/deprecated_finders/relation.rb:70:in `find_in_batches'
    from /Users/grimm/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.2/lib/active_record/relation/batches.rb:25:in `find_each'
    from /Users/grimm/.rvm/gems/ruby-2.1.0/gems/activerecord-4.0.2/lib/active_record/querying.rb:8:in `find_each'
    from (irb):10
    from /Users/grimm/.rvm/gems/ruby-2.1.0/gems/railties-4.0.2/lib/rails/commands/console.rb:90:in `start'
    from /Users/grimm/.rvm/gems/ruby-2.1.0/gems/railties-4.0.2/lib/rails/commands/console.rb:9:in `start'
    from /Users/grimm/.rvm/gems/ruby-2.1.0/gems/railties-4.0.2/lib/rails/commands.rb:62:in `<top (required)>'
    from bin/rails:4:in `require'
    from bin/rails:4

person grimmwerks    schedule 22.04.2015    source источник


Ответы (1)


Я получаю ту же ошибку при попытке перестроить (впервые установить) через командную строку Rails с PgSearch::Multisearch.rebuild(Professor). Вместо этого у меня сработала перестройка из командной строки с использованием альтернативный подход, рекомендуемый на Github:

rake pg_search:multisearch:rebuild[Professor]

Кажется, это работает для меня - это не выдает ошибку, и когда я иду в консоль Rails после и запускаю PgSearch.multisearch("query"), он возвращает результат, тогда как раньше он возвращал ошибку.

Я знаю, что это не исправление, но это решение непосредственной проблемы. Я надеюсь, что это поможет — публикация проблемы на их Github может привести к более полному исправлению.

person Razi Shaban    schedule 24.04.2015
comment
К сожалению, не для меня - я получаю Показать не мультипоиск. См. PgSearch::ClassMethods#multisearchable. - person grimmwerks; 24.04.2015
comment
Итак, вы пытаетесь PgSearch::Multisearch.rebuild(Show), но модель, в которую вы поместили include PgSearch и multisearchable :against => [:title, :description], оказывается Episode — похоже, вы пытаетесь перестроить не ту модель? Попробуйте поместить эти две строки (конечно, против изменений) в свою модель Show и повторите попытку. - person Razi Shaban; 24.04.2015