【问题标题】:MongoDB MongoMapper update embedded document (ruby on rails)MongoDB MongoMapper 更新嵌入式文档(ruby on rails)
【发布时间】:2011-11-03 19:23:30
【问题描述】:

这让我发疯了,我认为我可能错误地使用了嵌入式文档。

class User
    include MongoMapper::Document
    key :name, String
    many :businesses
end

class Business
    include MongoMapper::EmbeddedDocument
    key :name, String
    one :address
    many :clients
    belongs_to :user
end

class Address
    include MongoMapper::EmbeddedDocument
    key :name, String
    belongs_to :business
end

class Client
    include MongoMapper::EmbeddedDocument
    key :name, String
    belongs_to :business
end

我创建了一个用户,然后创建了一个企业,我现在想做的是向企业添加一个地址,但我无法做到。

我唯一能想到的就是通过名称或id找到用户,然后循环遍历businesss数组,找到名称匹配的企业并设置地址...

但老实说,这听起来很蹩脚,我认为有一种更优雅的方式来做到这一点。

谢谢

【问题讨论】:

  • 从字面上看,我想要一些东西:将地址设置为 user.businesses.business.id == something...

标签: ruby-on-rails ruby mongodb mongomapper


【解决方案1】:

首先,当您嵌入时,使用embedded_in 而不是belongs_to

class Business
    include MongoMapper::EmbeddedDocument
    key :name, String
    one :address
    many :clients
    embedded_in :user
end

class Address
    include MongoMapper::EmbeddedDocument
    key :name, String
    embedded_in :business
end

class Client
    include MongoMapper::EmbeddedDocument
    key :name, String
    embedded_in :business
end

原因是,在内部,belongs_to 创建了一个复杂的关联代理,它为非嵌入式关联执行各种数据库交互,而embedded_in 只是为_parent_document 方法创建一个别名。 belongs_to 仅适用于非嵌入式关联。

没有办法“很好地”查询嵌入的文档。我认为 Mongoid 可以让您假装嵌入式关联就像常规关联一样是可查询的,但 MongoMapper 不喜欢假装。在 MongoMapper 中,嵌入文档的数组就是一个 Array with very little sugar。 MongoDB 最终可能会允许嵌入文档的虚拟集合(它是 number 1 JIRA issue),我猜到那时 MM 家伙会想到一些更奇特的东西。

事实上,Ruby 的可枚举方法非常好,自己去发现并不是那么疯狂。

user = User.find("1234567abc")

user.business.select { |b| b.name == target_name }.each { |b| b.address = new_address }

user.save

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-02-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多