0

我有一个我自己无法找到答案的 Rails 问题。如果它非常简单或明显,我深表歉意,我在这里是一个完整的初学者。

所以我在我的数据库中有一个名为 :client_code 的列,它在模型中定义为:first_name 和:last_name 的第一个字符的小写连接。例如,如果我打开一个新表单并在 :first_name 中输入 'John',在 :last_name 中输入 'Doe',则 :client_code 会自动赋予 'jdoe' 的值。这是模型代码的相关部分:

class Client < ActiveRecord::Base

  before_validation :client_code_default_format
  validates_presence_of :first_name, :last_name, :email
  validates_uniqueness_of :client_code

  ...


  def client_code_default_format
    self.client_code = "#{first_name[0]}#{last_name}".downcase
  end
end

我想在此代码中添加一些内容,以便在有人输入具有相同确切名称的不同客户端的情况下,它不会通过唯一性验证,而是创建一个稍微修改的:client_code('jdoe2',例如)。我可能会弄清楚如何为所有这些添加索引,但我宁愿只包含数字作为在重复的情况下的故障保护。谁能指出我正确的方向?

4

2 回答 2

1

计算当前匹配Client对象的数量client_code应该可以

def client_code_default_format
  preferred_client_code = "#{first_name[0]}#{last_name}".downcase
  count = Client.count(:conditions => "client_code = #{preferred_client_code}")
  self.client_code = count == 0 ? preferred_client_code : preferred_client_code + count
end
于 2012-02-25T05:55:49.373 回答
1

非常感谢@Dieseltime 的回复。我接受了他的建议,并通过一些小改动获得了我想要的功能:

before_validation :format_client_code
validates_presence_of :first_name, :last_name, :email, :company_id
validates_uniqueness_of :client_code

...

def format_client_code
  unless self.client_code != nil
    default_client_code = "#{first_name[0]}#{last_name}".downcase
    count = Client.count(:conditions => "client_code = '#{default_client_code}'")
    if count == 0
      self.client_code = default_client_code
    else
      self.client_code = default_client_code + (count + 1).to_s
    end
  end
end
于 2012-02-25T22:30:36.047 回答