2012-11-13 2 views
1

У меня есть приложение Ruby on rails 3.2, где я пытаюсь использовать Tire и Elastic Search.Rails шина: импорт с пользовательской логикой

У меня есть модель пользователя, которая имеет следующие объявления:

include Tire::Model::Search 
include Tire::Model::Callbacks 

тогда я осуществил первоначальный импорт записей в упругом Поиск по телефонам:

rake environment tire:import CLASS=User FORCE=true 

Можно ли настроить импорт, так что он пропускает одного пользователя? У меня есть системный пользователь, которого я бы предпочел не индексировать?

ответ

3

Во-первых, задача Rake только удобный метод для самых обычных случаев, при попытке elasticsearch/загонят, и т.д. Для более сложных ситуациях, вы должны написать свой собственный код индексации - это должно быть очень легко.

Во-вторых, если у вас есть определенные условия, будет ли проиндексированы запись или нет, вы должны делать то, что README инструктирует вас: не include Tire::Model::Callbacks и управлять Индексация на протяжении жизненного цикла себя, например, с:

after_save do 
    update_index if state == 'published' 
end 
+0

Арен» Это два отдельных шага? Задача rake для начальной загрузки, когда вы импортируете существующие данные в Elasticsearch, а затем обратные вызовы, когда эти записи обновляются или удаляются. Казалось бы, сочетание моего ответа и вашего ответа правильно исключает элемент из индекса. – Planty

+0

Да, правильно, но в особых случаях, подобных этому, всегда лучше инвестировать время в тонкую настройку вашего пользовательского механизма индексирования, см., Например. https://github.com/karmi/tire/issues/509 – karmi

+0

Спасибо, я рад, что понимаю, что сейчас лучше. Я поставил обе части, чтобы решить мою проблему с начальной загрузкой и предотвратить любые текущие обновления или новых пользователей системы, вызывающих проблему. – Planty

1

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

В конце я написал задачу шины, которая вызывает регулярный импорт всех, а затем удаляет системную учетную запись из индекса.

namespace :tire do 
    desc 'Create search index on User' 
    task :index_users => :environment do 
    ENV['CLASS'] = 'User' 
    ENV['FORCE'] = 'TRUE' 
    Rake::Task['tire:import'].invoke 
    @user = User.find_by_type('System') 
    User.tire.index.remove @user 
    end 
end