【问题标题】:how can I require uniqueness of a "full_name" method, with first_name and last_name in my database?我如何要求数据库中包含 first_name 和 last_name 的“full_name”方法的唯一性?
【发布时间】:2015-07-04 12:49:20
【问题描述】:

用户可以在我的数据库中创建学生。现在,我对 first_name 和 last_name 的存在进行了模型验证。我的学生模型中有一个用于 full_name 的方法。

def full_name
"#{first_name} #{last_name}"
end

我想知道我必须做些什么来要求 full_name 的唯一性而不限制名字或姓氏。我希望能够拥有汤姆·史密斯、汤姆·威尔逊、汤姆·克兰西,而不是汤姆·史密斯的错误重入。

【问题讨论】:

  • 那么从设计的角度来看,您确定要这样做吗?您不仅不能拥有两个 Tom Smith,而且通过主动模型验证,每次更改姓名都需要加载其他所有人的名字和姓氏,以便与他们进行字符串比较。
  • 尝试在 first_name 和 last_name 列上添加唯一索引 - 请参阅 stackoverflow.com/questions/4123610/…
  • 只是一个想法。可能有 2 个 Tom Smiths,或者 3 个。名称不是唯一的。

标签: ruby-on-rails validation ruby-on-rails-4 activerecord model


【解决方案1】:

这样就可以了

validates_uniqueness_of :first_name, scope: :last_name

您还需要在 students 表中添加一个唯一索引,以避免竞争条件

add_index :students, [ :first_name, :last_name ], :unique => true

更多信息here.

【讨论】:

  • 这是最好的答案!
  • 这行得通,谢谢。当我在表单中重新输入名称时,出现错误.."PG::UniqueViolation: 错误:重复键值违反唯一约束 "index_students_on_first_name_and_last_name" 详细信息:键 (first_name, last_name)=(Tom, Smith) 已经存在. ...我可以在我的创建操作中添加什么来重新呈现带有“无法创建学生”或类似消息的表单?
  • @JeremyWalters 试试validates_uniqueness_of :first_name, scope: :last_name, message: "student could not be created"
【解决方案2】:

您可以尝试以下方法吗?

# student.rb
def full_name_uniqueness
     if Student.exists?(first_name: first_name, last_name: last_name)
       errors.add :base, "#{full_name} already exists" #change error key and message as you need
     end
end 

现在写一个自定义的验证 #student.rb

validates :full_name_uniqueness

【讨论】:

  • 可能你的意思是“如果”而不是“除非”
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2012-07-18
  • 1970-01-01
  • 1970-01-01
  • 2017-10-12
  • 1970-01-01
  • 2012-11-26
  • 1970-01-01
相关资源
最近更新 更多