Railsガイドにきちんと目を通して新しい知識を得る - マイグレーション編 -

ドキュメントを読み込むのは大事、ということでRailsガイドを頭から読んでいく取り組みをしています。 各章ごとに、(Railsガイドにちゃんと書いてあるのに)知らなかった機能を雑にまとめていきます。

今回は、マイグレーションの章です。

railsguides.jp

create_join_tableを使った多対多の中間テーブルの作成

リンクはこちら

railsチュートリアルでやるように、has_manyを使う方法しか知らなかったです。 この方法では、中間テーブルを明示的にはモデルとして扱わないので、用途は限定的かもしれませんが、機能として足りるときはスッキリ書けそうです。

ちなみに、各モデルにhas_and_belongs_to_manyを記述することで多対多の関係を記述できます。

class Product < ApplicationRecord
  has_and_belongs_to_many :categories
end

add_check_constraint で制約をつける

リンクはこちら

rails6.1から追加されたみたいです。 マイナスの値が入る可能性のないケースとかは結構あると思うので、使えそうです。

class AddPriceToProducts < ActiveRecord::Migration[7.0]
  def change
    add_column :products, :price, :integer
    add_check_constraint :products, "price > 0", name: "price_check"
  end
end
Product.create(price: -100)
# => ActiveRecord::StatementInvalid

revertでロールバックする

リンクはこちら

今までテーブルの削除時などdrop_tableで書いたりしてましたが、時短できるケースもありそうです。

以下のように書くことで、drop_tableと同じことをしていることになるみたいです。

class RevertCreateProducts < ActiveRecord::Migration[7.0]
  def change
    revert do
      create_table :products do |t|

        t.timestamps
      end
    end
  end
end