2013-04-17 22 views
3

我已经浏览了Tire文档,并且我明白可以使用Tire创建索引并将对象导入到Elasticsearch中,而无需使用ActiveModel includes。更新不使用Tire的轮胎索引:: Model :: Callbacks

我想保留我的模型文件完全清除任何轮胎映射,而是分开实施它们。

到目前为止,我已经创建了一个索引对象为我的会员模式是这样的:

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

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

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

UPDATE: 我的事实,ES被索引成员与实际ActiveRecord的ID,但通过产生ES一个唯一的ID甚至以为我是路过的ID在属性JSON混淆。

当我通过一个Ruby散列到import方法ID字段被尊重,这个问题就走了,我现在只是做了以下更新索引记录:

Tire.index('member') do 
    store(MemberIndexer.new(@member).attributes) 
end 

回答

1

我不知道你的意思是不知道_id,你发布的代码是@member.id,对吧?

但是你能完成这项计划是这样的:

def update_es_index! 
    Tire.index 'members' do 
    store(@member) 
    end 
end 

它会调用store method这会想出张贴到哪个URL。

+0

由于某些原因,当我将属性转换为json时,批量'import'方法不是尊重Member对象的id,而是在ES中生成唯一的id。一旦我向'import'方法提交红宝石哈希,一切都按预期工作。 –

6

update callback无非是下面的代码

after_save do 
    update_index 
end 

所以,如果你是从调用@ member.update_index某个地方,这会更新该记录索引更多。

+0

由于我没有在我的Member类中包含Tyre模块,因此'@ member'上没有'update_index'方法。最后,尽管问题是将json提交给'import'方法。 –

+0

或者,甚至更好 - 只有当我们的索引字段更改时才更新:updated_index如果已更改&%w(名称电子邮件已删除实名) – Kevin

0

原来,这个问题在将Ruby散列转换为JSON时出现了某种错误的翻译。

当我通过一个Ruby散列到import方法索引记录用适宜的ActiveRecord的ID创建,因此我能够只是调用store与包括ActiveRecord的ID时,我想更新索引的属性。