新規登録時にbuild(ActiveRecord)を用いて、親と関連付ける外部キーを2つセットする方法について
テーブル構成
Area
| id | name |
prefectures
| id | area_id | name |
prefecture_areas
| id | prefecture_id | name |
spots
| id | prefecture_id | prefecture_area_id | name |
buildを用いて、以下のようにデータを格納したいです。
areas(地方を管理するテーブル)
| id | name |
| -- | ---- |
| 1 | 近畿 |
| 2 | 九州 |
prefectures(県を管理するテーブル)
| id | area_id | name |
| -- | ------- | ---- |
| 1 | 1 | 兵庫 |
| 2 | 2 | 沖縄 |
prefecture_areas(県をさらに細分化する必要がある県のみ、県内のエリアを管理するテーブル)
| id | prefecture_id | name |
| -- | ------------- | ---- |
| 1 | 1 | 南部 |
spots(観光地を管理するテーブル)
| id | prefecture_id | prefecture_area_id | name |
| -- | ------------- | ------------------ | ------ |
| 1 | 1 | 1 | 姫路城
| 1 | 2 | NULL | 美ら海水族館
兵庫県は、prefecture_areasを作り、spotsを登録
沖縄県は、prefecture_areasを作らずに、spotsを登録
Modelの定義
class Area < ActiveRecord::Base
has_many :prefectures
end
class Prefecture < ActiveRecord::Base
has_many :prefecture_areas
has_many :spots
belongs_to :area
end
class PrefectureArea < ActiveRecord::Base
has_many :spots
belongs_to :prefecture
end
class Spot < ActiveRecord::Base
belongs_to :prefecture
belongs_to :prefecture_area
end
このModelの定義で、Area から Spot まで同時にbuildし、
spotsに姫路城を入れる際に、以下のようなコードを書きました。
(formは用いずに、保存します。)
Area.new(name: '近畿').prefectures.build(name: '兵庫').prefecture_areas.build(name: '南部').spots.build(name: '姫路城').save
すると、
INSERT INTO `spots` (`name`, `prefecture_area_id`, `created_at`, `updated_at`) VALUES ('姫路城', 1, '2016-10-23 09:36:13', '2016-10-23 09:36:13')
となり、prefecture_idをspotsに入れてくれません。
buildの段階で、spotsに、prefecture_idとprefecture_area_idを同時に入れることは不可能でしょうか?
長くなってしまいましたが、何卒よろしくお願いいたします。