mongoid-4如何在1对1关联中验证belongs_to的唯一性

时间:2015-08-04 16:53:27

标签: ruby-on-rails ruby-on-rails-4 mongoid mongoid4

我在2个mongoid模型之间有一对一的关联,并且我不断获得重复,即拥有多个具有相同parent_id(即用户)的子记录(卡)。我已经尝试验证了belongs_to关联的唯一性,如下所示,但它不起作用。

 class User
   include Mongoid::Document
   field :name, type: String 
   has_one :card
 end

第二种模式:

 class Card
   include Mongoid::Document
   field :name, type: String 
   belongs_to :user

   validates :user, :uniqueness => {:scope => :user_has_child}

   def user_has_child
     q = Segment.where(drop_id: {'$ne' =>  nil})
     s = q.map(&:drop_id)
     errors.add(:drop_id, "this user already has a card") if s.include?(:drop_id)
   end

 end

1 个答案:

答案 0 :(得分:1)

语法更简单。您只是想确保没有2个文档具有相同的user_id

class Card
  belongs_to :user

  validates_uniqueness_of :user

如果您想要n个字段的元组的唯一性,则需要使用范围。例如,如果用户每年最多只能有一张卡,则可以写

class Card
 field :year
 belongs_to :user  

 validates_uniqueness_of :user, scope: [:year] # A user can have one card per year

请注意,保存模型时适用验证,即。你试图坚持改变。如果某些验证失败,则调用.save将返回true或false,但内存中的对象始终被修改!例如,您可以在HTML输入字段中显示以前的值,这样用户就可以知道他写了什么并可以修复它(否则他必须重新写入所有信息,以防出现一个错误)

另外,Mongoid by default handles dirty tracking(现在是v5.0的文档,但对于Mongoid 4来说也是如此)。也就是说,您可以在内存中的对象上调用.changed? .changes, etc,以查看与数据库中的对象相比有哪些更改。