Tire中对ActiveRecord关联的支持正在起作用,但是需要在应用程序内部进行一些调整。毫无疑问,图书馆应该在这里做得更好,将来肯定会做得更好。
就是说,这是一个可以在Elasticsearch中与Rails的关联一起工作的Tire配置的完整示例:active_record_associations.rb
让我在这里强调几件事。
父模型
首先,必须确保将关联的更改通知关联的父模型。
给定我们有一个
Chapter模型“属于” a
Book,我们需要做:
class Chapter < ActiveRecord::base belongs_to :book, touch: trueend
这样,当我们执行以下操作时:
book.chapters.create text: "Lorem ipsum...."
该
book实例被通知增加的一章。
响应触摸
整理完这一部分后,我们需要将有关更改通知给 Tire ,并相应地更新elasticsearch索引:
class Book < ActiveRecord::base has_many :chapters after_touch() { tire.update_index }end(毫无疑问, Tire
应该
after_touch自行拦截通知,而不是强迫您这样做。这是另一方面,证明了绕过图书馆的限制以不伤眼睛的方式进行工作有多么容易)
在Rails <3.1中正确进行JSON序列化
尽管自述文件中提到您必须在Rails <3.1中禁用自动的“在JSON中添加根密钥”,但许多人还是忘记了它,因此您也必须在类定义中包括它:
self.include_root_in_json = false
elasticsearch的正确映射
现在是我们工作的重点-为我们的文档(模型)定义适当的映射:
mapping do indexes :title, type: 'string', boost: 10, analyzer: 'snowball' indexes :created_at, type: 'date' indexes :chapters do indexes :text, analyzer: 'snowball' endend
请注意,我们
title使用
created_at了相关模型的升序索引(作为“日期”)和章节文本。在Elasticsearch中,所有数据都有效地“归一化”为单个文档(如果这样的话会稍微有意义)。
正确的文档JSON序列化
作为最后一步,我们必须正确地序列化Elasticsearch索引中的文档。注意我们如何利用 ActiveRecord中 的便捷
to_json方法:
__
def to_indexed_json to_json( include: { chapters: { only: [:text] } } )end设置好所有这些设置之后,我们就可以在文档的
Book和
Chapter部分中搜索属性。
请运行开头链接的Ruby文件active_record_associations.rb,以查看完整图片。
有关更多信息,请参考以下资源:
- https://github.com/karmi/railscasts-episodes/commit/ee1f6f3
- https://github.com/karmi/railscasts-episodes/commit/03c45c3
- https://github.com/karmi/tire/blob/master/test/models/active_record_models.rb#L10-20



