fc2ブログ

2023.08 «  - - - - - 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 » 2023.10
TOP > DBテーブル間の結びつき その1【イントロ】

 ← DBテーブル間の結びつき その2【belongs_to の方のモデルで出来ること】 | TOP | オブジェクトのメソッドの一覧

DBテーブル間の結びつき その1【イントロ】 

2007年10月23日 ()
railsのDBテーブルで、複数のテーブルを結びつけておくと、(・∀・)イイことがあります。

早速、例を見ていくに限る!(強引?)

都道府県テーブルと市区町村テーブルがあったとします。

都道府県テーブル 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 トマトちゃん

【広告】

[2007.10.23(Tue) 01:02] RubyOnRails(Model)Trackback(0) | Comments(0)
↑TOPへ

 ← DBテーブル間の結びつき その2【belongs_to の方のモデルで出来ること】 | TOP | オブジェクトのメソッドの一覧

COMMENT

COMMENT POST















管理者にだけ表示

 ← DBテーブル間の結びつき その2【belongs_to の方のモデルで出来ること】 | TOP | オブジェクトのメソッドの一覧