如何在不使用Tire::Model::Callbacks的情况下更新Ruby on Rails轮胎索引?

2026-04-11 16:591阅读0评论SEO基础
  • 内容介绍
  • 文章标签
  • 相关推荐

本文共计455个文字,预计阅读时间需要2分钟。

如何在不使用Tire::Model::Callbacks的情况下更新Ruby on Rails轮胎索引?

我已经阅读了Tire文档,了解可以使用Tire创建索引并将对象导入Elasticsearch,而不需要使用ActiveModel包。我想要保持我的模型文件完全清除任何轮子映射,而不是单独实现它们。目前,我已停止使用它们。

我已经查看了Tire文档,我知道可以使用Tire创建索引并将对象导入Elasticsearch,而无需使用ActiveModel包含.

我想保持我的模型文件完全清除任何轮胎映射,而不是单独实现它们.

到目前为止,我已经为我的Member模型创建了一个索引对象,如下所示:

class MemberIndexer def initialize(member) @member = member end def attributes { id: @member.id, name: @member.full_name, age: @member.age, birthday: @member.birthday, type: 'member' }.to_json end def self.refresh_index Tire.index 'members' do delete create mappings: { member: { properties: { id: { type: 'integer' }, name: { type: 'string', boost: 5 }, age: { type: 'integer' }, birthday: { type: 'date' } } } } Member.find_in_batches do |members| import members.map { |m| MemberIndexer.new(m).attributes } end end end end

这工作正常,索引已创建,我可以正常搜索.我缺少的是使用Tire :: Model :: Callbacks可以包含的回调.是否可以使用轮胎更新索引中的单个记录,而无需在模型本身中包含Tire :: Model :: Callbacks?

例如,如果我更新成员,我想手动更新成员索引中的相应项.如果不知道该项目的_id,这可能吗?

我应该使用ActiveRecord id搜索对象,然后在索引上使用update方法吗?

更新:
令我感到困惑的是,ES正在使用实际的ActiveRecord id索引成员,但是在ES中生成一个唯一的ID,即使我认为我在属性json中传递了一个id.

当我将ruby哈希传递给import方法时,id字段得到了尊重,这个问题就消失了,因为我现在可以执行以下操作来更新索引记录:

Tire.index('member') do store(MemberIndexer.new(@member).attributes) end update callback只不过是以下代码

after_save do update_index end

因此,如果你从某个地方调用@ member.update_index,它将更新该记录的索引.

如何在不使用Tire::Model::Callbacks的情况下更新Ruby on Rails轮胎索引?

本文共计455个文字,预计阅读时间需要2分钟。

如何在不使用Tire::Model::Callbacks的情况下更新Ruby on Rails轮胎索引?

我已经阅读了Tire文档,了解可以使用Tire创建索引并将对象导入Elasticsearch,而不需要使用ActiveModel包。我想要保持我的模型文件完全清除任何轮子映射,而不是单独实现它们。目前,我已停止使用它们。

我已经查看了Tire文档,我知道可以使用Tire创建索引并将对象导入Elasticsearch,而无需使用ActiveModel包含.

我想保持我的模型文件完全清除任何轮胎映射,而不是单独实现它们.

到目前为止,我已经为我的Member模型创建了一个索引对象,如下所示:

class MemberIndexer def initialize(member) @member = member end def attributes { id: @member.id, name: @member.full_name, age: @member.age, birthday: @member.birthday, type: 'member' }.to_json end def self.refresh_index Tire.index 'members' do delete create mappings: { member: { properties: { id: { type: 'integer' }, name: { type: 'string', boost: 5 }, age: { type: 'integer' }, birthday: { type: 'date' } } } } Member.find_in_batches do |members| import members.map { |m| MemberIndexer.new(m).attributes } end end end end

这工作正常,索引已创建,我可以正常搜索.我缺少的是使用Tire :: Model :: Callbacks可以包含的回调.是否可以使用轮胎更新索引中的单个记录,而无需在模型本身中包含Tire :: Model :: Callbacks?

例如,如果我更新成员,我想手动更新成员索引中的相应项.如果不知道该项目的_id,这可能吗?

我应该使用ActiveRecord id搜索对象,然后在索引上使用update方法吗?

更新:
令我感到困惑的是,ES正在使用实际的ActiveRecord id索引成员,但是在ES中生成一个唯一的ID,即使我认为我在属性json中传递了一个id.

当我将ruby哈希传递给import方法时,id字段得到了尊重,这个问题就消失了,因为我现在可以执行以下操作来更新索引记录:

Tire.index('member') do store(MemberIndexer.new(@member).attributes) end update callback只不过是以下代码

after_save do update_index end

因此,如果你从某个地方调用@ member.update_index,它将更新该记录的索引.

如何在不使用Tire::Model::Callbacks的情况下更新Ruby on Rails轮胎索引?