【问题标题】:Mongoid embeds / has_many :through equivalentMongoid embeds / has_many :through 等价
【发布时间】:2011-07-15 16:31:14
【问题描述】:

在 Mongoid 中,我如何实现 ActiveRecord :through => 提供的相同功能?

class Advertiser
    include Mongoid::Document
    embeds_many :campaigns

    # how would I do this
    embeds_many :advertisements, :through => :campaigns

end

class Campaign
    embedded_in :advertiser
    embeds_many :advertisements
end

class Advertisement
    embedded_in :campaign

    # or this?
    embedded_in :advertiser, :through => :campaign
end

那么就可以了 Advertiser.first.advertisementsAdvertisement.first.advertiser

Advertiser.campaigns.collect{|campaign| campaign.advertisement} 不是一个选项

如何,我将如何使用references_many / referenced_in 做到这些?

【问题讨论】:

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


    【解决方案1】:

    简短的回答是你不能。 MongoDB 没有连接表的概念,也没有一般的连接。 Mongoid 多对多“模拟”是通过在每一侧存储外键数组来完成的。

    回复评论: MongoDB 是一个文档存储。因此,它适合“文档”高度异构的情况。当您将 Advertisers 存储在 Campains 和 Advertisements 的子树中时,您必须以 ruby​​ 代码收集 Advertisers 的广告。如果您的数据具有非常同质的形式,那么您可以考虑使用关系数据库。我们经常使用 MySQL 来关联对象,然后将 MongoDB 文档添加到对象中,以便它们可扩展。

    【讨论】:

    • 由于 MongoDB 不支持连接,我可以使用 MongoDB 对示例中的功能进行建模的最佳方式是什么?
    • MongoDB 是一个文档存储。因此,它适合“文档”高度异构的情况。当您将 Advertisers 存储在 Campains 和 Advertisements 的子树中时,您必须以 ruby​​ 代码收集 Advertisers 的广告。如果您的数据具有非常同质的形式,那么您可以考虑使用关系数据库。我们经常使用 MySQL 来关联对象,然后将 MongoDB 文档添加到对象中,以便它们可扩展。
    • @moritz +1,这个评论应该放在帖子里——这是我听过的对 NoSQL 和 SQL 数据库之间本质区别的最好解释之一。
    • @louism:谢谢夸奖。我刚做了。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-04
    • 2016-01-20
    • 2014-09-01
    • 2011-07-24
    • 2011-03-12
    • 1970-01-01
    相关资源
    最近更新 更多