スポンサーリンク
概要
RailsのActiveRecordで多対多のデータを定義した時のデータ作成方法のメモ。
SQL自分で書きたいマンには、SQLが見えない形で抽象化されると、最初は違和感があり大変であった。
データ前提
記事とカテゴリ(レビュー,日記など)のデータがあり、多対多のアソシエーションを持つとする。
throughで指定するフィールドは先に指定する必要がある。(article_categorys)
1 2 3 4 5 6 7 8 9 10 |
class Article < ApplicationRecord has_many :article_categorys has_many :categorys, through: :article_categorys end class Category < ApplicationRecord has_many :article_categorys has_many :aricles, through: :article_categorys end |
下記のような中間テーブルを作るとする。
rails g model Article_Category article:references category:references
1 2 3 4 |
class ArticleCategory < ApplicationRecord belongs_to :article belongs_to :category end |
作成方法
この時にseed.rdで初期データを作成する時のメモになる。
関係を持つテーブルのIDを列挙してそれを中間テーブルに突っ込めば良いだけ。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
# カテゴリ Category.create(name: 'グルメ') Category.create(name: '観光') # 記事 Article.create(title: 'タイトル1', sub_title: 'サブタイトル1', content: 'hoge') # 記事、カテゴリのidを列挙して中間テーブルに投入 Article.all.ids.sort.each do |article_id| Category.all.ids.sort.each do |category_id| ArticleCategory.create(article_id: article_id, category_id: category_id) end end |
外部キーの削除に関して、中間テーブルに対してdependent: :destroyを付与する事で削除可能になる。
付与していない状態で、article_categorysにidを持つ状態でArticleをdestoryをした時には外部参照エラーとなる。
1 2 3 4 |
class Article has_many :article_categorys, dependent: :destroy has_many :categorys, through: :article_categorys end |