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件のコメントがあります。
コメントは受け付けていません。
foo = Foo.new(params)
foo[:id] = 1000
foo.save
でも行けると思います。
要はidはデフォルトでattr_protected指定されているからmass-assignmentのときに除外されるという事情なので。
おー、お久しぶりです。
確かに行けました!
ありがとうございます。
理屈が分かるとスッキリしますね。