0

我正在尝试遵循Mongoid 3 中的建议 - 检查复合键的唯一性,以拥有一个对 2 个字段具有唯一约束的模型。

id 声明是这样的:

field :_id, type: String, default: &method(:generate_id)

private

  def generate_id
    user.id.to_s + offering.id.to_s
  end

但是,如果我这样做,当我通过 new 实例化一个对象时,它就会有一个 conniption,因为它会尝试在它拥有用户和产品之前生成 id,并且它(正确地)不想使用 nil 的 id。我可以传入用户并作为构造函数参数提供,一切都很好。

我的问题是,这是正确的做法吗?考虑到我为了获得一个独特的约束而必须做的所有愚蠢的古怪行为,这感觉很脏。该代码根本不是很有意透露。有没有更好的办法?

4

1 回答 1

8

使用普通的 MongoDB,您可以像这样使用 JavaScript 创建这个索引(假设您的集合名称是注册):

db.registrations.ensureIndex( { "user_id": 1, "offering_id": 1 }, { unique: true } )

要使用 Mongoid 生成此索引,请将其添加到您的模型中:

index({ user_id: 1, offering_id: 1 }, { unique: true })

并运行rake db:mongoid:create_indexes

如果您想继续生成_idwith generate_id,可以将生成移至before_validate回调。

field :_id, type: String

before_validate :generate_id

private

def generate_id
  self._id ||= "#{user.id}:#{offering}"
end
于 2013-04-19T02:18:33.400 回答