用mongoid和Rails去规范化的最好方法是什么?用mongoid反规格化
使用“嵌入式”关系似乎不起作用(或仅用于嵌入整个原始文档)。
我现在的解决方案商店和检索非规范化的属性作为OrderedHash:
collection.update({_id: id, ...}, {..., denormalized: {_id: other.id, _type: other._type, a: other.a, b: other.b}}
def denormalized
Mongoid::Factory.build(attributes[:denormalized]["_type"], attributes[:denormalized])
end
编辑:我要指出,我没有尝试https://github.com/logandk/mongoid_denormalize
它变平的非规范化的属性(在本例下面,它将存储author_name而不是author:{name:“value”},它不支持多个非规范化关系(例如authors:[{name:“First Co-Author”,_id:1},{name :“Second Co-Author”,_id:2}])
编辑:请求了一个例子。
class User # this class uses STI so _type field is important
include Mongoid::Document
field :name # this is the field I want to de-normalize to where Users are referenced
def write_book
Book.create!({title: "Some Text", author: {_id: self.id, _type: self._type, name: self.name})
end
end
class Book
include Mongoid::Document
field :title
# embeds_one :author, polymorphic: true
# tried this but it doesn't seem to be correct usage... it sort of works but
# I run into problems with cycles and infinite loops when used extensively
# because (I think) of how mongoid works internally, expecting embeds_one
# to mean something different
def author
Mongoid::Factory.build(attributes[:author]["_type"], attributes[:author])
end
end
正确的解决方案会有ActiveModel方法,如new_record?工作以及* _path和* _url路由助手。
你可以添加一个例子,你想反规范化? – Voldy 2011-04-20 19:32:40
编辑原文,以提供示例 – Jason 2011-04-20 19:44:15
另一个例子(摘自MongoDB in Action,第62页)将是电子商务订单。您会将运送地址和物品/价格归一化。那在Mongoid中如何实现? – Raphael 2012-03-21 23:08:43