2017-05-17 3 views
2

i ont Account Modèle, Asset, Capital et Revenue ce tableau sont tous hérité dans mon modèle Account. J'ai 3 types d'attributs dans mon modèle de compte. nom, code et type. quand je crée un compte où sera d'insérer se passera dans mon compte et l'autre est dans mon type, par exempleSunspot Gem aide en STI TABLEAU

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

sql exploitera deux Insérer un pour le modèle de compte et un pour le tableau des actifs

et mon travail bien sunspot il réindexation ma base de données et je peux chercher mes params

mais quand je mets à jour mon modèle de mon compte sql terme un insert et une mise à jour

ma question est Comment puis-je réindexer mon modèle lorsque je mets à jour. avec une donnée particulière. je peux faire Sunspot.reindex mais cela va charger toutes les données dans mon SQL. cela me ralentira

Répondre

1

je mis à mon modèle

after_update do 
    Sunspot.index Account.where(id: self.id) 
end 
+0

en ce qui concerne l'indexation, son traité correctement automatiquement par 'sunspot'. La seule chose que l'on vous conseille de faire manuellement est "Commit". – illusionist

+0

valider sont pour ajouter, supprimer et éditer mon seul problème est d'éditer – wiwit

+0

son étrange pourquoi j'ai eu un problème dans l'édition quand j'utilise STI mais c'est ok maintenant – wiwit

1

Selon the documentation, les objets seront indexés automatiquement si vous êtes sur Rails. Mais il mentionne aussi vous pouvez réindexer une classe manuellement:

Account.reindex 
Sunspot.commit 

Il suggère également d'utiliser Sunspot.index sur des objets individuels.

4

sql exploitera deux Insérer un pour le modèle de compte et un pour l'actif Tableau

Pour votre information, vous utilisez STI lorsque vous souhaitez partager même table de base de données entre plusieurs modèles, car ils sont semblables dans les attributs et les comportements. Comme modèle AdminUser est susceptible d'avoir presque les mêmes attributs/colonnes que PublisherUser ou ReaderUser. Par conséquent, vous voudrez peut-être avoir une table commune appelée users ou le modèle User et partager ce tableau parmi les modèles mentionnés ci-dessus.

point est: ActiveRecord exécutera une seule requête SQL non deux, comme:

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

ma question est de savoir comment puis-je réindexer mon modèle quand je mets à jour. avec une donnée particulière. je peux faire Sunspot.reindex mais ceci chargera toutes les données dans mon sql. cela va me faire ralentir

En fait, sunspot_rails est conçu pour se réindexer automatiquement chaque fois que vous apportez des modifications à votre modèle/enregistrement. Il écoute le savecallbacks. Mais vous devez vous assurer que vous n'utilisez pas des méthodes comme update_column(s). See the list of silent create/update methods which do not trigger callbacks and validations at all.


De plus, vous devez comprendre le concept de batch size en termes de Solr. Pour des raisons de performances, tous vos nouveaux index ne sont pas immédiatement validés. Commis signifie écrire des index dans la base de données comme dans les validations de SGBDR.Par défaut, le batch_size pour les validations est .Signification après 50 exécutions de méthode index seuls les index seront validés et vous pourrez rechercher les enregistrements. Pour changer, utilisez suivant

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

ou

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

Pour ré-indexation manuelle, vous pouvez utiliser comme @Kathryn suggéré. Mais, je ne pense pas que vous devez intervenir dans l'opération automatique. Je pense que tu n'as pas vu de résultats immédiats alors tu t'inquiétais.