验证独特字段时避免重复的优雅解决方案?

时间:2012-12-30 02:50:06

标签: ruby-on-rails validation unique

我确实在模型中成功验证了重复的url。下面的代码显示,当用户创建新书签时,验证效果很好。

validate :url_cannot_be_duplicated_per_user

def url_cannot_be_duplicated_per_user
  current_user = User.find(self.user_id)
  if current_user.bookmarks.any?{|b| b.url.eql? self.url }
    errors.add(:url, "already added")
  end
end

但问题是验证会阻止编辑书签,因为在编辑基本相同的书签时,它会再次通过模型并捕获重复。因此,使用该代码,更新操作永远不会发生。

知道怎么解决吗?

PS:我确实在控制器中放了一个块,以便在提交模型之前先检查网址。尽管验证工作非常正确,但代码仍然很混乱。

我的控制器

if duplicated? params[:bookmark][:url]
  flash[:error] = 'This bookmark already added'
  @bookmark = current_user.bookmarks.build(params[:bookmark])
  render 'new'
else

1 个答案:

答案 0 :(得分:2)

您可以使用uniqueness验证scope

class Bookmark < ActiveRecord::Base
  validates :url, :uniqueness => {:scope => :user_id}
end