【问题标题】:PgSearch 1.0.0 throws ModelNotMultisearchable error when trying to rebuild from consolePgSearch 1.0.0 在尝试从控制台重建时抛出 ModelNotMultisearchable 错误
【发布时间】:2015-04-22 19:37:36
【问题描述】:

我有一个包含 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}
              }

正如您所看到的,我曾尝试将其设置为 multiserachable 方式。

最近有一些我们知道应该返回的项目不在搜索结果中,我认为我必须重建 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

【问题讨论】:

    标签: ruby-on-rails database pg-search


    【解决方案1】:

    我在尝试使用PgSearch::Multisearch.rebuild(Professor) 通过 Rails 命令行进行重建(第一次安装)时遇到了同样的错误。对我有用的是使用 Github 上推荐的 the alternative approach 从命令行进行重建:

    rake pg_search:multisearch:rebuild[Professor]

    这似乎对我有用——它不会引发错误,当我在运行 PgSearch.multisearch("query") 之后转到 Rails 控制台时,它会返回结果,而在它返回错误之前。

    我知道这不是解决办法,但它可以解决眼前的问题。我希望它有所帮助——在他们的 Github 上发布问题可能会导致更全面的修复。

    【讨论】:

    • 遗憾的是不适合我 - 我得到 Show is not multisearchable。请参阅 PgSearch::ClassMethods#multisearchable。
    • 所以您正在尝试PgSearch::Multisearch.rebuild(Show),但您放入include PgSearchmultisearchable :against =&gt; [:title, :description] 的模型是Episode - 似乎您正在尝试在错误的模型上重建?尝试将这两行(当然是针对已更改的)放入您的 Show 模型中,然后重试。
    猜你喜欢
    • 2021-05-09
    • 2014-11-11
    • 2023-03-04
    • 2017-01-12
    • 2014-04-03
    • 2023-02-20
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    相关资源
    最近更新 更多