【serializeの思わぬ落とし穴!?】アソシエーションを使いこなそう
カテゴリ:インターン生ブログ
こんにちは。インターン生の鈴木です。
今回はRailsでの異なるモデル同士の関連付け(アソシエーション)について記述します。
はじめに
モデルを扱っていると「一つのカラムに複数のデータを保存したい!」といった状況があるかと思います。
id | user | |
1 | 太郎 | test1@sample.com,test2@sample.com,test3@sample.com |
2 | 次郎 | test4@sample.com |
↑ざっくりとこんな感じ
これを実現する方法はいくつかあるようで、
僕が初めに試したのはserializeを使用する方法でした。
serializeとはtext型のカラムに配列やハッシュなどの特殊な形式のデータをYAML形式に変換して保存する機能です。
しかし、YAML形式に変換してから保存されてしまうので、データの中身を正常に検索することができなくなってしまう上に、ソートが困難になってしまいます…。
そこでアソシエーションを利用してデータを格納する方法に行きつきました。
アソシエーションとは、異なるモデル同士を紐づけることで同じモデルのように扱える仕組みです。
先ほどの例だと、
[userテーブル]
id | user |
1 | 太郎 |
2 | 次郎 |
↑ ↓ この二つのモデルを作成し関連付ける
[emailテーブル]
user_id | |
test1@sample.com | 1 |
test2@sample.com | 1 |
test3@sample.com | 1 |
test4@sample.com | 2 |
という仕組みになります。
いざ、実践
ここからは具体的な方法を説明します。
と言っても、既存のファイルに一行ずつ追記するだけなのでとても簡単です。
参照先から参照元の情報にアクセスできるようにする
まず、参照先のテーブル(先ほどの例だとuserテーブル)のモデルを開き、
has_many :emails
と追記します。「:emails」の部分は参照元のテーブル名(先ほどの例だとemailテーブル)に変更してください。
※テーブル名が複数形になっていることに注意
これで参照元と参照先の関係が出来上がります。
user = User.find_by(id: 1)
user.emails (参照先.参照元)
=>[test1@sample.com,test2@sample.com,test3@sample.com]
という具合で簡単にemailテーブルへアクセスできるようになります。
参照元からも参照先にアクセスできるようにする。
今度は先ほどの逆でを行っていきます。
参照元のテーブルのモデルを開き、
belongs_to :user
と追記します。こちらも「:user]」の部分は任意のテーブル名に変更して記述してください。
※こちらはテーブル名が単数形になっていることに注意
これで参照元からも参照先の情報にアクセスすることができるようになります。
例:
email = Email.find_by(email: test1@sample.com)
email.user
=>太郎
最後に
これをマスターすればより複雑なデータも簡単に扱うことができます。
複雑すぎてイメージできないものは、一度紙に書いて整理してもいいかもしれません。
inglow inc.はWebプロモーションとマーケティングオートメーションを2軸とした名古屋本社のデジタルマーケティング専門会社です。一般的なWeb広告運用会社さんは広告運用に主軸をおきますが、当社はあくまでWebプロモーション。クライアントのソリューションに合わせて、Webライター、カメラマンを使い、オリジナルコンテンツを設計する。更にそこへの誘導導線も築き、ここから初めて運用検証、改善フェーズに入る。またマーケティングオートメーション領域では導入支援はもちろん、導入後、広告施策と合わせたキャンペーン設計までWebプロモーション×マーケティングオートメーションを一気通貫で行います。
プロモーションとしてのデジタルマーケティングに関するご相談はお気軽にお問い合わせください。
株式会社inglow | |
事業ドメイン | マーケティングオートメーション導入・伴走サポート |
Webプロモーションの戦略立案・実行 | |
メール(お問い合わせ) | info@inglow.jp |
電話番号 | 052-218-2660 |
住所 | 愛知県名古屋市中区丸の内2-18-22三博ビル7F |