复合键上的Mongoid唯一约束

时间:2013-04-19 01:54:09

标签: ruby-on-rails mongodb mongoid

我正在尝试按照Mongoid 3 - Check for uniqueness of composite key中的建议来建立一个对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而且它(正确地)不想使用id的id。我可以传入用户并提供构造函数参数,一切都很好。

我的问题是,这是正确的做法吗?考虑到为了得到一个独特的约束,我必须做的所有钝的古怪感觉都很脏。代码根本没有透露意图。还有更好的方法吗?

1 个答案:

答案 0 :(得分:7)

使用普通的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

如果您想继续使用_id生成generate_id,可以将代数移至before_validate回调。

field :_id, type: String

before_validate :generate_id

private

def generate_id
  self._id ||= "#{user.id}:#{offering}"
end