使用mongoid和Rails去标准化的最佳方法是什么?
使用“嵌入式”关系似乎不起作用(或者除了嵌入整个原始文档之外的其他任何内容)。
我现在的解决方案将去规范化的属性存储和检索为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”}并且它不支持多个非规范化关系(例如作者:[{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路由助手。
答案 0 :(得分:-1)
这会将用户存储为书中的嵌入式作者文档。
class User
include Mongoid::Document
end
#instead of the write book method, you could just do this:
book = Book.create(title: "Old Man And The Sea", users: [user])
class Book
include Mongoid::Document
embeds_many :authors
field :title
def users=(users)
users.each do |user|
authors.build(user: user, name: user.name)
end
end
end
class Author
include Mongoid::Document
embedded_in :book
referenced_in :user
field :name
end