Mongoid + rails 4 - 实现User&以下:嵌入式模型的单一性验证

时间:2015-07-19 01:53:43

标签: ruby-on-rails ruby mongodb mongoid

我正在使用Rails 4.2.1和Mongoid 4.0.0

我有一个User模型,它嵌入了Following模型。我想要达到的效果是:

{
    username:  # This is the id
    ...
    followings: [
        {
            _id:
            username:
            datetime:
        }
    ]
}

我不希望followings包含具有相同用户名的条目。怎么做到这一点?

我尝试了两种方法:

  1. 我将validates :username, presence: true, uniqueness: true放入Following模型的代码中。但是这个验证是全局性的 - 如果我有John和Sam作为两个用户,而John跟随Sam,那么当Sam想跟随John时,就会出现重复错误。

  2. 我在User模型中添加了一个索引:

    index ({ 'followings.username': 1 }, { unique: true, drop_dups: true }) 这种方法的问题在于,当我创建用户John时,他的以下字段将具有用户名null,然后如果我创建用户Sam,则会抛出错误,因为null用户名重复:

    E11000 duplicate key error index: myapp_development.users.$followings.username_1 dup key: { : null }

  3. 非常感谢任何帮助

1 个答案:

答案 0 :(得分:1)

嗯,事实证明,由于碎片问题,这种建模UserFollowing的方式会导致文档的增长,并且不会最好地利用“富文档”功能,并会影响性能。来自MongoDB doc

  

通常,嵌入为读取操作提供了更好的性能,   以及在a中请求和检索相关数据的能力   单一数据库操作。嵌入式数据模型使其成为可能   在单个原子写操作中更新相关数据。

     

但是,在文档中嵌入相关数据可能会导致情况   文件在创建后增长。使用MMAPv1存储引擎,   文档增长会影响写入性能并导致数据   碎片。

所以我吸取了教训。之前不够充分。所以我将放弃这种建模方式,并将它们分成不同的集合。