太阳黑子宝石在STI表中使用

时间:2017-05-17 10:12:13

标签: ruby-on-rails ruby sunspot sunspot-rails sunspot-solr

我有Account模型,AssetCapitalRevenue此表都在我的Account模型中继承。我的帐户模型中有3种属性。名称,代码和类型。当我创建一个帐户,其中将插入将在我的帐户中发生一个,另一个在我的类型中,例如

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

sql将运行两个插入一个用于帐户模型,一个用于资产表

我的太阳黑子工作得很好重新索引我的数据库,我可以搜索我的参数

但是当我更新我的模型帐户时,我的sql运行一次插入和一次更新

我的问题是我在更新时如何重新索引我的模型。有特定数据。我可以Sunspot.reindex,但这将加载我的SQL中的所有数据。这将导致我放慢速度

3 个答案:

答案 0 :(得分:4)

  

sql将运行两个插入一个用于帐户模型,一个用于资产表

当您想要在多个模型之间共享相同的数据库表时,您使用STI是因为它们在属性和行为上相似。与AdminUser模型类似,可能与PublisherUserReaderUser具有几乎相同的属性/列。因此,您可能希望拥有一个名为users或模型User的公用表,并在上述模型中共享此表。

是:ActiveRecord将运行单个SQL查询而不是两个,如:

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

我的问题是我在更新时如何重新索引我的模型。有特定数据。我可以做Sunspot.reindex,但这将加载我的SQL中的所有数据。这将导致我放慢速度

实际上,sunspot_rails用于在您对模型/记录进行更改时自动重新索引。它会收听save callbacks

但是你需要确保你没有使用像update_column(s)这样的方法。 See the list of silent create/update methods which do not trigger callbacks and validations at all

此外,您需要从Solr的角度理解batch size的概念。出于性能原因,不会立即提交所有新索引。 已提交表示将索引写入数据库,就像在RDBMS提交中一样。

默认情况下,提交的batch_size 50 。在50个index方法执行后的含义仅提交索引,您将能够搜索记录。要更改它,请使用以下

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

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

对于手动重新编制索引,您可以使用建议的@Kathryn

但是,我认为你不需要介入自动操作。我认为你没有立即看到结果,所以你担心。

答案 1 :(得分:1)

According to the documentation, objects will be indexed automatically if you are on Rails. But it also mentions you can reindex a class manually:

Account.reindex
Sunspot.commit

It also suggests using Sunspot.index on individual objects.

答案 2 :(得分:1)

我把它放到我的模型中

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