2009-09-14 94 views
10

假设我有项目,即与标记多对多关联。我正在使用has_many到,所以我有单独的连接模型。验证Rails中多对多关联的唯一性

如何创建验证,检查连接模型的唯一性?现在我只有

has_many :tags, :through => :taggings, :uniq => true 

但是,这不保存验证。

回答

4

尝试validates_associated

我相信,应该允许连接模型验证在保存之前运行。所以你的情况:

class Project 
    has many :tags, :through => :taggings 
    validates_associated :taggings 
end 

class Taggings 
    belongs_to :tags 

    #your validations here.... 
end 

class Tag 
    has_many :taggings 
end 
15

我想你想要的是validates_uniqueness_of

class Taggings 
    belongs_to :tags 
    validates_uniqueness_of :tag_id, :scope => :project_id 
end 

这是我使用的是什么,并且效果很好。

+0

嗨,但是当我用'project.tags << Tag.find_or_create_by_name>设计“添加一个重复的标签到''它引发了一个'ActiveRecord :: ValidateError'异常时,是否有一种方法可以静默地重复失败当标签是新的时添加标签没有问题?管理这个最好的方法是什么?谢谢 – 2012-04-18 09:40:52

+0

有可能是一种更简单的方法来做到这一点,但我认为这只会添加非重复项目:'design_tags = Tag.find_or_create_by_name'Design' project.tags << design_tags.reject {| tag | project.tags.include?(tag)}' – 2012-04-18 21:21:55