railsの正規化

SQLアンチパターン

SQLアンチパターン

これ、名著です。読んでいて苦い記憶がうわーってなったりすごく納得したり。何より読みやすいのが良いです。DBに関連する領域の人は必読と思います。

さて、表題の件、自分のrailsプロジェクトを正規化したいなぁーとおもいまして。

statusテーブル
id name
1  hoge
2  fuga
issueテーブル
id name status_id
1  hoge  1

とかやりたいわけです。statusを文字列で持ちたくないし、statusの一覧をサクッと列挙したい。
redmineのソース読んだらそのものズバリがありました。

class Issue < ActiveRecord::Base
   belongs_to :status,foreign_key: :status_id
end

でOK。簡単ですね。もっとrails使いこなしたいものです。
使い方は

[root@xxxx xxxx]# rails c
Loading development environment (Rails 4.0.1)
irb(main):002:0> i = Issue.find 1
  Issue Load (0.2ms)  SELECT `issues`.* FROM `issues` WHERE `issues`.`id` = 1 LIMIT 1
=> #<Issue id: 1, name: "hoge", status_id: 2, created_at: "2013-12-05 15:08:16", updated_at: "2013-12-05 15:09:34">
irb(main):003:0> s = Status.create!(name: "50%")
   (0.1ms)  BEGIN
  SQL (0.2ms)  INSERT INTO `statuses` (`created_at`, `name`, `updated_at`) VALUES ('2013-12-05 15:18:07', '50%', '2013-12-05 15:18:07')
   (40.0ms)  COMMIT
=> #<Status id: 3, name: "50%", created_at: "2013-12-05 15:18:07", updated_at: "2013-12-05 15:18:07">
irb(main):004:0> i.status
  Status Load (0.3ms)  SELECT `statuses`.* FROM `statuses` WHERE `statuses`.`id` = 2 ORDER BY `statuses`.`id` ASC LIMIT 1
=> #<Status id: 2, name: "100%", created_at: "2013-12-05 15:09:08", updated_at: "2013-12-05 15:09:08">
irb(main):005:0> i.status = s
=> #<Status id: 3, name: "50%", created_at: "2013-12-05 15:18:07", updated_at: "2013-12-05 15:18:07">
irb(main):006:0> i.save
   (0.1ms)  BEGIN
  SQL (0.2ms)  UPDATE `issues` SET `status_id` = 3, `updated_at` = '2013-12-05 15:18:29' WHERE `issues`.`id` = 1
   (29.6ms)  COMMIT
=> true

ですです。では。