【问题标题】:Elegant solution to avoid duplicates when validating a unique field?验证唯一字段时避免重复的优雅解决方案?
【发布时间】:2012-12-30 02:50:06
【问题描述】:

我确实成功地直接在模型中验证了重复的 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 else 在提交给模型之前先检查 url。尽管验证工作非常正确,但代码变得混乱。

我的控制器

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

【问题讨论】:

    标签: ruby-on-rails validation unique


    【解决方案1】:

    您可以使用scope 验证uniqueness

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

    【讨论】:

    • 你能给我关于验证的完整链接吗,我在 Rails 文档中找不到
    • this 你在找什么?使用validates :something, :uniqueness =&gt; [true or some options],您可以使用validates_uniqueness_for 中可用的任何选项,如here
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-19
    • 2018-04-28
    • 1970-01-01
    • 1970-01-01
    • 2011-03-31
    • 2011-02-13
    • 1970-01-01
    相关资源
    最近更新 更多