Solr Sunspot не получает аргументов в модели рельсов - PullRequest
0 голосов
/ 21 февраля 2011

Я следил за скринкастом Райана Бейтса и строил базовый поиск, но решил, что мне нужно что-то лучше простого текстового поиска MySQL, и надеялся, что гем Sol Sunspot может сработать.

Согласно скринкасту http://media.railscasts.com/videos/037_simple_search_form.mov, Я настроил поиск в моей модели.

Мой контроллер имеет простой

def index
  @tasks = Task.search(params)
end

А у моей модели

def self.search(params)
   if params[:search]
      search do
           keywords params[:search]
           paginate :page=>params[:page], :per_page =>20
      end
   else
     select('id,title,desc').paginate(:page=>params[:page], :per_page =>20)
   end
end

Когда я загружаю страницу без поиска, я получаю правильный вывод.

Когда я предоставляю слово для поиска, я получаю

wrong number of arguments (0 for 1)

Я пробовал как 'search do', так и 'Task.search do', поскольку, похоже, в этом разница между учебниками, которые я видел http://tech.favoritemedium.com/2010/01/full-text-search-in-rails-with-sunspot.html,, и тем, как я это делаю, передается из контроллера в метод.

Любые предложения о том, как это сделать ??

Ответы [ 2 ]

1 голос
/ 24 февраля 2011

Как уже упоминалось работником, точная причина ошибки в том, что вы уже определили метод search, который вы пытаетесь вызвать изнутри себя, без ожидаемых параметров.

То, что вам нужно вызвать, это метод solr_search, который является фактическим методом, который определяет Sunspot (названный таким образом, чтобы вы могли предоставить свой собственный search метод).

Кроме того, объект, возвращаемый методом solr_search, является объектом поиска с некоторой метаинформацией о самом поиске. Вы, вероятно, хотите, чтобы экземпляры объектов ActiveRecord возвращались методом results для этого объекта.

Сложив их вместе, вы захотите, чтобы ваш метод search в итоге выглядел так:

def self.search(params)
  if params[:search]
    solr_search do
      keywords params[:search]
      paginate :page => params[:page], :per_page => 20
    end.results
  else
    select('id,title,desc').paginate(:page => params[:page], :per_page => 20)
  end
end
0 голосов
/ 23 февраля 2011

Вы получаете "неправильное количество аргументов", потому что вы определили self.search как функцию в модели, а затем пытаетесь сослаться на метод поиска Sunspot.

Вы пробовали пропустить с помощью адаптеров Rails и перейти непосредственно к синтаксису Sunspot?

Sunspot.search(self) do
  keywords params[:search]
  paginate :page=>params[:page], :per_page =>20
end

Может решить вашу проблему.

...