【问题标题】:mongoid-4 how to validate uniqueness of belongs_to in 1 to 1 associationmongoid-4 如何在 1 对 1 关联中验证 belongs_to 的唯一性
【发布时间】:2015-08-04 16:53:26
【问题描述】:

我在 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

【问题讨论】:

  • 我不明白你为什么需要比validates_uniqueness_of :user_id 更复杂的东西? (或者我认为 user 也应该可以)
  • 谢谢你是正确的。我以前尝试过,但似乎没有用。但是当你建议它时,我再次尝试它并失败了然后我意识到我需要重新加载数据以查看它没有保存到数据库中,即使内存中的副本仍然显示错误的记录没有保存到分贝。
  • 酷。我回答了更多细节,您可以投票和接受;-)

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


【解决方案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 将返回真或假,但内存中的对象总是被修改!例如,您可以在 HTML 输入字段中显示以前的值,这样用户就知道他写了什么并可以修复它(否则他必须重写他的所有信息以防出现一个错误)

另外,Mongoid by default handles dirty tracking(这是现在 v5.0 的文档,但在 Mongoid 4 中是一样的)。也就是说,你可以在内存中的对象上调用.changed? .changes, etc,看看与DB中的对象相比有什么变化。

【讨论】:

  • 感谢 Cyril 的宝贵时间和其他信息。
猜你喜欢
  • 1970-01-01
  • 2011-10-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-07-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多