0

自分で答えを見つけることができなかったレールの質問があります。非常に単純または明白である場合は申し訳ありませんが、私はここでは完全な初心者です。

そのため、データベースに :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

@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 に答える
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 に答える