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

Going Rails-way

Ruby on Rails 道を突き詰めたい

特定のspecで外部キー制約を無効にする

外部キー制約を使用すると、コード上のミスによりデータベースに不整合が発生するのを未然に防ぐことができてよい。

Active Record マイグレーション | Rails ガイド

Rails:外部キー制約をマイグレーションで表現する方法

第四章 キーレスエントリ(外部キー嫌い) - Qiita

stub_modelなどを使っていると、制約の影響でsaveでエラーが発生したりして煩わしいこともある。今の主題ではないのでここでは制約のことは置いておきたいのである。

仕方がないので

# spec/support/foreign_key_checks.rb

RSpec.configure do |config|
  config.before(:each, foreign_key_checks: false) do
    ActiveRecord::Base.connection.execute('SET FOREIGN_KEY_CHECKS=0')
  end

  config.after(:each, foreign_key_checks: false) do
    ActiveRecord::Base.connection.execute('SET FOREIGN_KEY_CHECKS=1')
  end
end

こういうのを作っておけば、こうやって特定のspecでだけ外部キー制約を無効にできる。

describe '#hoge', foreign_key_checks: false do
  # この中のexampleは外部キー制約を無視する
  it '...' do 
    # 
  end

  it '...' do 
    # ...
  end
end

いいやり方かはしらない。