ActiveRecordで任意のidを持つレコードを追加する

各レコードのidの決まっているマスタを作るときなどに知っていると便利な小技。
普通ActiveRecordのidは自動で採番され、レコード作成時に指定することも後で変更することもできない。

例えば最後のレコードのidが100の時に

maker = Maker.create(:id => 1000)

などとしても

maker.id
#=> 101

といった結果になる。

しかしfind_or_create_by_idを使うとidを指定してレコードを作成できる。

maker = Maker.find_or_create_by_id(1000)

とすると

maker.id
#=> 1000

イレギュラーな挙動かもしれないけれど、今のところはこのように動く。

ちなみに更新はやっぱりできないので後からidを変えたくなった場合はexecute_sqlなどで強引に変えるしかないっぽいです。

この投稿へのコメント

  1. さく said on 2009年3月10日 at 12:02 AM

    foo = Foo.new(params)
    foo[:id] = 1000
    foo.save
    でも行けると思います。

    要はidはデフォルトでattr_protected指定されているからmass-assignmentのときに除外されるという事情なので。

  2. akahige said on 2009年3月10日 at 2:24 AM

    おー、お久しぶりです。

    確かに行けました!
    ありがとうございます。
    理屈が分かるとスッキリしますね。

コメントを残す

メールアドレスが公開されることはありません。

この投稿へのトラックバック

トラックバックはありません。

トラックバック URL