QA@IT

railsでモデルのidを自動生成ではなく指定する

8926 PV

今、Twitterのフォロー・フォロワーの状態を確認するサービスを作っています。

RailsでUserのモデルを作成すると自動的に user_id のカラムが生成され、
Userの作成ごとに自動的に連番が割り振られるのですが、

Userの生成時には必ずTwitter側で管理するidを取得する仕組みにしているので
このtwitterのidをuser_idの代わりに使うことはできるでしょうか?

現状は user_id とは別に twitter_id のためのカラムを作り、そこに保存しているのですが
こちらの記事を参考にコードを書いていると混乱してきてしまいました。
http://d.hatena.ne.jp/hichiriki/20081116

このような時はuser_idを明示的に保存する方法別カラムにtwitter_idを保存する方法
どちらがRailsとして推奨される書き方になるのでしょうか?

回答

まず、Railsの機能として、IDを明示的に指定して保存するのは可能です。保存前にid=(new_id)で値を設定してあげれば、そのIDで保存されます。

u = User.new(name: 'moro')
u.id = 42
u.save!

ですから、 idを自動生成ではなく指定すること はできますね。DBMSごとに、この次にデータを入れた場合の挙動が違うので(42からの連番になったり、自動採番された結果からの連番になったり)、それは確認しておいてください。

ですが。

RailsにおけるDB設計の一般論として、外部システムのIDを自DBのIDとしてそのまま使うのは推奨できません。ようするに自然キーを使うかどうかという話だと思うのですが、少なくともRailsは人工キーを採用することを薦めています。

ちなみに、TwitterのIDは、いまと同じようにtwitter_idとして別カラムに保存し、候補キーの一つに留めるのをおすすめします。間違ってintにしてしまうと桁あふれやフォーマット変更でひどい目にあうので、外部システムのキーはvarcharにしておくのが鉄板だと思っています。

ということで

このような時はuser_idを明示的に保存する方法別カラムにtwitter_idを保存する方法
どちらがRailsとして推奨される書き方になるのでしょうか?

に対しては、別カラムにtwitter_idを保存する方法をおすすめします。

ちなみに、用語や「でも自然キーでいいじゃない」という議論に興味があれば、Wikipediaの記述がそれなりによいポインタになっていると思います。

http://ja.wikipedia.org/wiki/%E4%B8%BB%E3%82%AD%E3%83%BC

編集 履歴 (0)
  • なるほど、詳しい解説ありがとうございます。まさにこのようなお話を聞きたかったんです。自然キーと人工キーという用語もためになりました。別カラムにtwitter_idを保存する方法で作ることにします。 -
ウォッチ

この質問への回答やコメントをメールでお知らせします。