是否有一种简单或至少优雅的方法可以通过关联防止多态 has_many 中的重复条目?
我有两个可以标记的模型、故事和链接。我有意识地决定不在这里使用插件。我想真正了解正在发生的一切,而不是依赖于我没有完全掌握的其他人的代码。
要查看我的问题是什么,如果我在控制台中运行以下命令(假设故事和标签对象已经存在于数据库中)
s = Story.find_by_id(1)
t = Tag.find_by_id(1)
s.tags << t
s.tags << t
我的 taggings 连接表将添加两个条目,每个条目都有相同的确切数据(tag_id = 1,taggable_id = 1,taggable_type = "Story")。这对我来说似乎不太合适。因此,为了防止这种情况发生,我在我的标记模型中添加了以下内容:
before_validation :validate_uniqueness
def validate_uniqueness
taggings = Tagging.find(:all, :conditions => { :tag_id => self.tag_id, :taggable_id => self.taggable_id, :taggable_type => self.taggable_type })
if !taggings.empty?
return false
end
return true
end
它几乎可以按预期工作,但是如果我尝试将重复标签添加到故事或链接中,则会收到 ActiveRecord::RecordInvalid: Validation failed 异常。似乎当您将关联添加到列表时,它会调用保存!(而不是保存 sans !)方法,如果出现问题而不是仅仅返回 false,则会引发异常。这不是我想要发生的。我想我可以用 try/catch 来围绕任何添加新标签的尝试,但这违背了你不应该期待你的例外的想法,这是我完全期望发生的事情。
当我想要做的只是因为存在重复而默默地不将对象保存到数据库时,是否有更好的方法不会引发异常?