Камень солнечных пятен, используемый в STI TABLE

у меня есть Account модель, Asset, Capital и Revenue эта таблица унаследована в моей модели Account. у меня есть 3 вида атрибутов в моей модели учетной записи. название, код и тип. когда я создаю учетную запись, куда будет вставляться, произойдет одна в моей учетной записи, а другая в моем типе, например

Account.create(name: "test123", code:"test123", type:"Asset")

sql будет запускать две вставки: одну для модели учетной записи и одну для таблицы активов.

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

но когда я обновляю свою учетную запись модели, мой sql запускает одну вставку и одно обновление

мой вопрос в том, как я могу переиндексировать свою модель при обновлении. с конкретными данными. я могу сделать Sunspot.reindex, но это загрузит все данные в мой sql. это заставит меня замедлиться


person Deez Nuuts    schedule 17.05.2017    source источник


Ответы (3)


sql будет запускать две вставки: одну для модели учетной записи и одну для таблицы активов.

К вашему сведению, вы используете STI, когда хотите использовать одну и ту же таблицу базы данных между несколькими моделями, потому что они похожи по атрибутам и поведению. Подобная модель AdminUser, вероятно, будет иметь почти те же атрибуты/столбцы, что и PublisherUser или ReaderUser. Поэтому вы можете захотеть иметь общую таблицу с именем users или модель User и использовать эту таблицу среди вышеупомянутых моделей.

Смысл в том, что ActiveRecord будет выполнять один SQL-запрос, а не два, например:

INSERT INTO "accounts" ("name", "code", "type") VALUES ('test123', 'test123', 'Asset')

мой вопрос в том, как я могу переиндексировать свою модель при обновлении. с конкретными данными. я могу сделать Sunspot.reindex, но это загрузит все данные в мой sql. это заставит меня замедлиться

На самом деле sunspot_rails предназначен для автоматической переиндексации всякий раз, когда вы вносите изменения в свою модель/запись. Он прослушивает save обратные вызовы.

Но вам нужно убедиться, что вы не используете такие методы, как update_column(s). См. список автоматических методов создания/обновления, которые не вызывают обратные вызовы и проверки. вообще.


Кроме того, вам необходимо понимать концепцию batch size с точки зрения Solr. По соображениям производительности все ваши новые индексы не фиксируются немедленно. Committed означает запись индексов в базу данных, как в RDBMS.

По умолчанию batch_size для коммитов составляет 50. Это означает, что после 50 index выполнения метода будут зафиксированы только индексы, и вы сможете искать записи. Чтобы изменить его, используйте следующее

# in config/initializers/sunspot_config.rb
Sunspot.config.indexing.default_batch_size = 1 # or any number

or

# in models; its not considered good though
after_commit do
  Sunspot.commit
end

Для переиндексации вручную вы можете использовать предложенный @Kathryn.

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

person illusionist    schedule 18.06.2017

Согласно документации, объекты будут индексироваться автоматически, если вы используете Rails. Но также упоминается, что вы можете переиндексировать класс вручную:

Account.reindex
Sunspot.commit

Также предлагается использовать Sunspot.index для отдельных объектов.

person Kathryn    schedule 15.06.2017

я поставил это на свою модель

 after_update do
  Sunspot.index Account.where(id: self.id)
end
person Deez Nuuts    schedule 19.06.2017
comment
что касается индексации, она автоматически обрабатывается sunspot. единственное, что вам рекомендуется делать вручную, это Commit. - person illusionist; 19.06.2017
comment
commit для добавления, удаления и редактирования, моя единственная проблема - редактировать - person Deez Nuuts; 19.06.2017
comment
странно, почему у меня проблемы с редактированием, когда я использую STI, но теперь все в порядке - person Deez Nuuts; 19.06.2017