我Labellings
属于Emails
和Labels
。
每个标签必须是电子邮件/标签对的唯一标签 - 因此电子邮件只能标记为“测试”一次。
我正在使用validates_uniqueness_of :label_id, :scope => :email_id
执行此操作。这可以按预期工作。
当我标记电子邮件时,我想添加标签(如果它是唯一的),如果电子邮件已标有该标签,则不执行任何操作。
我不想在我的应用程序周围复制验证功能,例如:
email.labels << label unless email.labels.include?(label)
是否可以确保每个标签都有唯一的email_id / label_id对,而无需手动检查或处理异常?
答案 0 :(得分:1)
我还没有对它进行过测试,但您可以覆盖关联代理中的<<
,例如:
class Email < ActiveRecord::Base
has_many :labelings
has_many :labels, :through => :labelings do
def <<(label)
unless proxy_owner.labels.include?(label)
proxy_owner.labelings << Labeling.new(:email => proxy_owner, :label => label)
end
end
end
end