読者です 読者をやめる 読者になる 読者になる

spring of life

技術、ときどき日常のブログ(予定)

多対多の関係のモデル作成

Rails

今回はhas_and_belongs_to_manyを使う方法で実装してみた

  • 例として、というか自分が家計簿のアプリで実装したのは、収支情報(payment)とカテゴリ(category)の関連の作成
  • まずはスキーマの作成
    • 中間テーブルのファイル名はアルファベット順という規則(categories → payments )らしい
bundle exec rails g model payment
bundle exec rails g model category
bundle exec rails g migration create_categories_payments
  • payments と categories は好きに属性を追加するとして、中間テーブルの設定を以下のようにする
    • インデックスの設定とかはご自由にどうぞ、みたいな感じで
class CreateCategoriesPayments < ActiveRecord::Migration
  def change
    create_table :categories_payments, :id => false do |t|
      t.references :category, :index => true, :null => false
      t.references :payment, :index => true, :null => false
    end

    add_index :categories_payments, [:category_id, :payment_id], :unique => true
  end
end
  • モデルに関連を追加する
# app/models/payment.rb
class Payment < ActiveRecord::Base
  has_and_belongs_to_many :categories
  ...
end

# app/models/category.rb
class Category < ActiveRecord::Base
  has_and_belongs_to_many :payments
  ...
end

これでincludesとかjoinsとかが使えるようになる
例えば、カテゴリで検索をかける場合、

# app/models/payment.rb
class Payment < ActiveRecord::Base
  has_and_belongs_to_many :categories
  ...
  scope :category, ->(category) { joins(:categories).where('categories.name = ?', category) }
  ...
end

みたいな感じで書いといて、コントローラー側とかで

def index
  ...
  Payment.category('食費')
  ...
end

と書けば、name属性が食費のカテゴリが付いてる収支情報が取れる


問題はここからなんだよなぁ。。。
ビューにはどう書くとキレイなんだろ?
カテゴリとか今入力してるとこを選択するようにしたいし、リストの先頭を空欄にして、そこに新しいカテゴリを入力して登録すればカテゴリが新規作成されるようにしたい