3

モデルの start_date に基づいて一意の名前を生成する必要があります。動作している次のコードがあります。ただし、ご覧のとおり、文字 Z までしかサポートしていません。このシーケンスのように、Z を超えて機能させる方法はありますか?A,B,C,...X,Y,Z,AA,AB,AC,AD,AE...AZ,BA,BB,BC...

  def generate_name
    ("A".."Z").each do |letter|
      random_token = start_date.strftime("%m%d%y") + letter
      break random_token unless Tour.where(name: random_token).exists?
    end
  end
4

4 に答える 4

2
def letters
  ('a'..'z').each { |i| yield i }
  letters do |i|
    ('a'..'z').each { |j| yield i+j }
  end
end

def generate_name
  letters do |letter|
    random_token = start_date.strftime("%m%d%y") + letter
    break random_token unless Tour.where(name: random_token).exists?
  end
end
于 2013-04-24T01:35:54.613 に答える
1

サムの答えはあなたが要求したものとまったく同じように見えますが、問題を調べるのに役立つ可能性のある別の方法を次に示します。

文字列は、数字が「a」..「z」で表される基数 26 の数値と考えてください。この方法とあなたが要求した方法の唯一の違いは、最初の 2 桁の数字 (エラー、2 文字の文字列) がaaではなくbaになることです ( a = 0、b = 1 で数え始めたと仮定すると、など) 0 で始まる整数 (最初のもの以外) を記述しないのと同じ理由で、a (最初のもの以外) で始まる文字列は生成しません。

名前dwが生成した 100 番目の名前であることを非常に迅速に計算することが有用である場合、このアプローチにはメリットがあります。これは、 16 進数という単語を会話や少なくともドキュメントに組み込む良い方法でもあります。

于 2013-04-24T03:17:43.617 に答える