ruby-on-rails - 如何在Mongoid中强制执行唯一的嵌入式文档

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

我有以下型号

class Person 
  include Mongoid::Document
  embeds_many :tasks
end

class Task
  include Mongoid::Document
  embedded_in :commit, :inverse_of => :tasks
  field :name
end

如何确保以下几点?
person.tasks.create :name => "create facebook killer"
person.tasks.create :name => "create facebook killer"

person.tasks.count == 1

different_person.tasks.create :name => "create facebook killer"
person.tasks.count == 1
different_person.tasks.count == 1

即任务名称在特定人员中是唯一的

在检查完索引文档后,我认为以下方法可能会起作用:
class Person 
  include Mongoid::Document
  embeds_many :tasks

  index [
      ["tasks.name", Mongo::ASCENDING], 
      ["_id", Mongo::ASCENDING]
  ], :unique => true
end


person.tasks.create :name => "create facebook killer"
person.tasks.create :name => "create facebook killer"

仍然会产生重复。

以上在Person中显示的索引配置将转换为mongodb
db.things.ensureIndex({firstname : 1, 'tasks.name' : 1}, {unique : true})

最佳答案

默认情况下,索引不是唯一的。如果您在此查看Mongo Docs,则唯一性是一个额外的标志。

我不知道确切的Mongoid翻译,但是您正在寻找这样的东西:
db.things.ensureIndex({firstname : 1}, {unique : true, dropDups : true})

关于ruby-on-rails - 如何在Mongoid中强制执行唯一的嵌入式文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4338757/

相关文章:

ruby-on-rails-3 - 其余的响应时间从哪里来?

ruby-on-rails - 如何测试 rails 模型的 after_initialize 回调?

node.js - 当新的主 Node 当选后,Express 无法连接到 mongodb 副本集

node.js - 使用或不使用 'new' 关键字创建 Mongoose 模式?

json - Mongodb - 为现有集合添加架构

css - 使用 Bootstrap 和 Rails 设计复选框样式?

ruby-on-rails - 将用户带回到代码的开头

ruby-on-rails - 如何将json数组中的数据保存到数据库MongoDB中?

ruby-on-rails - 阻止将重复项添加到 Ruby 对象数组中

ruby-on-rails - 如何在运行 Ruby 2.7.0 时抑制 RSpec 中的警告