mysql - 如何通过在 rails 中递增来保存唯一的字符串?

标签 mysql ruby-on-rails ruby activerecord auto-increment

如何将唯一的字符串保存到我的数据库中,如果该值存在则增加它。

我所追求的行为类似于您保存文件时的行为,例如foo.txt, foo1.txt

我不想返回“不是唯一值”的错误消息。

class Person < ActiveRecord::Base
  attr_accessible :name
end

Person.create(:name => 'Dave') # => 'Dave'
Person.create(:name => 'Dave') # => 'Dave1'
Person.create(:name => 'Dave') # => 'Dave2'

我正在使用 ruby​​、rails 和 mysql

最佳答案

您不需要为您的模型设置验证唯一性。你可以使用这样的东西:

class Person < ActiveRecord::Base
 attr_accessible :name
 before_create :check_and_increment


 private
 def check_and_increment
   if Person.exists? name: self.name
     similar_persons = get_all_with_same_name self.name
     next_num = similar_persons.max_by{|m| m.scan(/\d+/)}.scan(/\d+/).first.nil? ? 1 : similar_persons.max_by{|m| m.scan(/\d+/)}.scan(/\d+/).first.to_i + 1
     self.name = "#{self.name}#{next_num}"
   else
     true
   end 
 end

 def get_all_with_same_name name
   where("name LIKE ?", 'name%')     
 end

end

对于您的问题,这是一个简单的想法。例如,需要小心像 Anna 和 Annastasia 这样的人。这些人有不同的名字,但他们的名字是重叠的。

希望这对您有所帮助。

关于mysql - 如何通过在 rails 中递增来保存唯一的字符串?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24702814/

相关文章:

php - Laravel 在多数据库环境中使用错误的数据库

mysql - 在我的网站上为每个用户分配一个 MySQL 数据库是否不合理?

ruby-on-rails - 使用 accepts_nested_attributes_for 为 FactoryGirl 对象生成嵌套属性

ruby-on-rails - Heroku vs DotCloud vs Duostack vs 其他云/PaaS 提供商(Rails 和非 Rails)?

ruby - 包裹 block 以使用细化

mysql - 查询总是返回一个空行?

php - 使用 PHP 在多个页面上存储数据

ruby-on-rails - 令人费解的 "duplicate key"错误 (PostgreSQL)

ruby - 删除指定节点之后的所有节点

mysql - 按一年中的周查找 ActiveRecord 对象