pg_search по нескольким моделям в рельсах?

Я пытаюсь использовать pg_search для поиска по двум моделям. У меня есть модель «Наем» с двумя столбцами «child_id» и «book_id». Я хочу проиндексировать дочернее имя, связанное с child_id в модели «Дети».

Моя модель выглядит так:

Hire.rb

class Hire < ActiveRecord::Base

  belongs_to :book
  belongs_to :child
  accepts_nested_attributes_for :book
  accepts_nested_attributes_for :child

  include PgSearch
  multisearchable :against => [:child_id, child_forename]

  def child_forename
    child.forename
  end

end

но когда я пытаюсь построить индекс (rake pg_search:multisearch:rebuild[Hires]), я получаю следующую ошибку:

rake aborted!
NameError: undefined local variable or method `child_forename' for Hire (call 'Hire.connection' to establish a connection):Class
/Library/Ruby/Gems/2.0.0/gems/activerecord-4.2.4/lib/active_record/dynamic_matchers.rb:26:in `method_missing'
/Users/James/Documents/websites/STAlibrary/app/models/hire.rb:12:in `<class:Hire>'
/Users/James/Documents/websites/STAlibrary/app/models/hire.rb:1:in `<top (required)>'
/Library/Ruby/Gems/2.0.0/gems/activesupport-4.2.4/lib/active_support/dependencies.rb:457:in `load'

Как я могу построить этот запрос для индексации дочернего имени?


person James Osborn    schedule 18.01.2016    source источник


Ответы (3)


Вам не хватает двоеточия перед child_forename.

Вам нужно передать символы:

multisearchable :against => [:child_id, :child_forename]

Данная ошибка сообщает вам, что метод «child_forename» не определен. Это связано с тем, что интерпретатор ruby ​​читает файл сверху вниз, а метод в этот момент еще не определен. Но если бы это было так, строка оценивалась бы как

multisearchable :against => [:child_id, "Mary"]

что, вероятно, не то, что вы хотите. Если вы правильно передаете символ, метод с таким именем вызывается позже в некотором обратном вызове on_update, когда создается экземпляр объекта и индексируется содержимое объекта.

person ToniTornado    schedule 19.01.2016

Попробуйте определить метод child_forename перед multisearchable:

class Movie < ActiveRecord::Base
  belongs_to :director

  def director_name
    director.name
  end

  multisearchable against: [:name, :director_name]
...

Дайте мне знать, если это работает. Кажется, работает нормально для теста, который я пробовал некоторое время назад.

person Mihai Ionescu    schedule 19.01.2016
comment
:director_name — это символ в вашем примере, поэтому метод не вызывается сразу в этой строке. Порядок в данном случае не имеет значения. - person ToniTornado; 19.01.2016

У меня были некоторые проблемы с поиском pg. Так что я просто сделал свой собственный. Проверьте это.

Как создать функцию поиска — Ruby On Rails

person joeyk16    schedule 19.01.2016