【问题标题】:Rails model with Mongoid Embedded and Standalone带有 Mongoid 嵌入式和独立的 Rails 模型
【发布时间】:2012-06-13 23:32:24
【问题描述】:

如何创建一个能够保存在自己的集合中并嵌入到另一个文档中的 Mongoid 模型?

【问题讨论】:

    标签: ruby-on-rails-3 mongodb mongoid


    【解决方案1】:

    简短的回答:你不能。

    当您在两个 Mongoid 文档之间使用嵌入关系时,这是因为您希望子模型在其自己的集合中。一个嵌入文档,字面意思是:嵌入其父级中。

    我不确定您是否是 Mongoid 的新手,因此您实际上可能正在寻找的是引用关系,它的行为更像是传统的 RDBMS 关系,其中子文档存储对父文档 ID 的引用.这方面的 Mongoid 文档以 here 开头。

    鉴于这些嵌入式模型,在两者之间切换非常容易:

    class Person
      include Mongoid::Document
    
      field :name
      embeds_many :phone_numbers
    end
    
    class PhoneNumber
      include Mongoid::Document
    
      field :area_code
      field :number
    
      embedded_in :person
    end
    

    你可以只更改embeds_manyembedded_in,所以它变成:

    class Person
      include Mongoid::Document
    
      field :name
      has_many :phone_numbers
    end
    
    class PhoneNumber
      include Mongoid::Document
    
      field :area_code
      field :number
    
      belongs_to :person
    end
    

    它会起作用的。现在,您可以使用以下语句直接查询电话号码等操作:PhoneNumber.where(:area_code => "212")

    【讨论】:

    • 我想补充一点,如果是为了去规范化github.com/dzello/mongoid_alize应该是一个好的开始。
    • 那颗宝石太棒了@rubish!很好的发现!
    • 我害怕那个。我想要此功能的原因是用于临时上传存储。用户上传图片,并将其存储在临时集合中,然后可以动态显示在创建表单上。在他们保存他们正在处理的记录后,临时图像将嵌入到该记录中。 (我无法在尚未创建的文档中存储嵌入的项目。)我只需要创建一个临时模型来嵌入图像。我只是希望跳过这个额外的步骤并存储图像模型直接。
    • 哇,mongoid_alize gem 看起来棒极了!它不能解决这个确切的问题,但我绝对可以在我的应用程序的其他地方使用它。
    • 啊好吧!这就说得通了。几个星期以来,我一直在考虑一个几乎相同的问题。您可以做的一件事(我没有尝试过)是创建两个模型,一个说TemporaryUploadUserImage。将所有共享功能放入 /lib/ 中的单个模块中,然后将该模块包含在两个类中。唯一的区别是一个被嵌入而另一个被引用。如果您需要更多详细信息 - 请告诉我,我会更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-13
    • 2020-03-16
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多