DBテーブル間の結びつき その1【イントロ】
早速、例を見ていくに限る!(強引?)
都道府県テーブルと市区町村テーブルがあったとします。
都道府県テーブル prefectures
+----------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| name | varchar(255) | YES | | NULL | |
| katakana | varchar(255) | YES | | NULL | |
+----------+--------------+------+-----+---------+----------------+
市区町村テーブル cities
+---------------+--------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+---------------+--------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| prefecture_id | int(11) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| hiragana | varchar(255) | YES | | NULL | |
+---------------+--------------+------+-----+---------+----------------+
さらに、このテーブルには、以下のようにデータが入っていたとします。
都道府県テーブル prefectures
+----+--------------+--------------------+
| id | name | katakana |
+----+--------------+--------------------+
| 1 | 東京都 | トウキョウト |
| 2 | 千葉県 | チバケン |
| 3 | 埼玉県 | サイタマケン |
| 4 | 神奈川県 | カナガワケン |
+----+--------------+--------------------+
市区町村テーブル cities
+----+---------------+--------------+-----------------+
| id | prefecture_id | name | hiragana |
+----+---------------+--------------+-----------------+
| 1 | 1 | 港区 | みなとく |
| 2 | 1 | 葛飾区 | かつしかく |
| 3 | 1 | 世田谷区 | せたがやく |
| 4 | 2 | 船橋市 | ふなばしし |
| 5 | 2 | 我孫子市 | あびこし |
| 6 | 3 | 草加市 | そうかし |
| 7 | 3 | 和光市 | わこうし |
| 8 | 4 | 川崎市 | かわさきし |
| 9 | 4 | 鎌倉市 | かまくらし |
+----+---------------+--------------+-----------------+
大事なのは、コ・コ・カ・ラ。ラブリーハート
都道府県モデルと、市区町村モデルに、それぞれの主従関係と対応関係を書いておきます。
1つの都道府県に、たくさんの市区町村が存在するので、都道府県モデルは、has_many を使います。
app/models/prefecture.rb
class Prefecture < ActiveRecord::Base
has_many :cities # 複数形で書くこと
end
1つの市区町村は、ある都道府県に属しているので、belong_to を使います。ええと、もう少し詳しく説明すると、市区町村テーブルの中に、都道府県ID用のカラムがあるので、市区町村が都道府県に属していると判断して belong_to を使うようにします。
app/models/city.rb
class City < ActiveRecord::Base
belongs_to :prefecture # 単数形で書くこと
end
さてさて、この has_many とか belong_to とかを書いて何が楽しいの?みたいになりますが、こうすることで自分と結びついているものを1行で書くことが出来ます。
といってもこれまた分かりづらいので、例を見ていくに限る!
例えば、東京都から、港区のひらがな読みが楽々参照できるという訳です。(主にコントローラからこの技を使うことが多いでしょう)
tokyo = Prefecture.find_by_name('東京都')
minatoku_hiragana = tokyo.cities.find_by_name('港区').hiragana # has_many だから city は複数形
てな感じです。
もし has_many と belong_to の記述をモデルにしていなかったら、次のようなまどろっこしいことをしなければ同じ事はできません。
tokyo = Prefecture.find_by_name('東京都')
minatoku_hiragana = City.find_by_prefecture_id_and_name(tokyo.id, '港区').hiragana
うーん・・・こうして並べて書いてみると、大して変わらないなあ orz
でも、1番目の方が2番目より分かりやすいですよね、パッと見。
そして、逆に、港区から東京都のカタカナ読みが楽々参照できます。
minatoku = City.find_by_name('港区')
tokyo_katakana = minatoku.prefecture.katakana # belongs_to だから prefecture は単数形
これが、has_many と belong_to の無い世界だと↓のようにまどろっこしく書かなくてはなりません。
minatoku = City.find_by_name('港区')
tokyo_katakana = Prefecture.find(minatoku.prefecture_id).katakana
やっぱりあまりまどろっこしさが伝わらない・・・orz
でも、1番目の方が2番目より分かりやすいですよね、パッと見。(しつこい?)
でもこれだけではないんです、has_* と belongs_to のすごさは。
それは次回以降に載せたいと思います。
じゃあ、チャオチャオっとチャオっちゃおー。バイバーイ by トマトちゃん
【広告】