各レコードの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などで強引に変えるしかないっぽいです。



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