Railsで開発をしているさいに、バリテーションテストであったり、表示テストを行いたいさいに、任意の長さを持つランダムな文字列を作成して、それを使いたいとします。現在、以下のような汚いワンライナーを利用して、それを実現しています:

  random_string = ->(n){ ->{ (0..n).map{ ->{ ["a", "あ"].sample }.call() }}.call().join }

  random_string.call(10)
  # => "aあaaaaあaああa"

  random_string.call(20)
  # => "あaaaaaaaaaあaaああaあaaああ"

  random_string.call(30)
  # => "ああaあaaaあああああaあaaaああああああaaaあaあaあ"

当然のことながら、このようなワンライナーは書く分にも読む分にもあまり綺麗ではありませんし、もう少しいい方法があるのではないかと思いました。

ちなみに、意図しているのは以下の通りです:

  • このメソッドは eachなどで利用することを意図しています。例としては User.all.each { |u| u.name = random_string.call(30) }という感じで。

  • 生成する文字列に使用する文字列は指定できるほうが望ましい。例えば、上の例なら、サンプルの文字列にaだけを利用したい

  • 呼び出されるたびに違う文字列を生成したい(何度呼んでも同じ文字列だと困る)

  • 生成する文字列を引数などを使って指定できると嬉しい

以上、いい方法があれば教えて下さい。