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

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

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

<pre>maker = Maker.create(:id => 1000)</pre>

などとしても

<pre>maker.id
#=> 101</pre>

といった結果になる。

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

<pre>maker = Maker.find_or_create_by_id(1000)</pre>

とすると

<pre>maker.id
#=> 1000</pre>

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

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

ActiveRecordで任意のidを持つレコードを追加する” に対して2件のコメントがあります。

  1. さく より:

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

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

  2. akahige より:

    おー、お久しぶりです。

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

コメントは受け付けていません。