【发布时间】:2011-02-22 16:28:11
【问题描述】:
是否有一种简单或至少优雅的方法可以通过关联来防止多态 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 包围任何添加新标签的尝试,但这违背了你不应该期待你的异常的想法,这是我完全期望发生的事情。
当我想要做的只是因为存在重复对象而默默地不将对象保存到数据库时,是否有更好的方法不会引发异常?
【问题讨论】:
标签: ruby-on-rails ruby activerecord polymorphic-associations has-many-through