我在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
答案 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
,以查看与数据库中的对象相比有哪些更改。