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

Railsのマイグレーション機能でハマったこと

Ruby
こんにちは、新卒1年目の永井です。  
最近の悩みは花粉症で鼻が常にむずむずしていることです。  

この時期はマスクを常に装着しています。  
メガネが曇ります。  
マスクを外します。  
鼻がむずむずします。

以前、インターンシップについての記事を書かせて頂きましたが、  
今回はRailsに関するエンジニアっぽいことを書きたいと思います。  
…エンジニアなので! 
お題はRailsで開発をする人にとってはお馴染みのマイグレーションについて。  
あれですね、DBいじるヤツです。  
そのマイグレーションを触る時にハマったことがあるので、  
つらつらっと書いていきます。

Railsのバージョンは 4.1.8 です。

 カラム追加とデータ追加を同時に行うとコケる


 ID("id") と 名前("name") を持っている社員("Member")テーブルに 年齢("age") を追加して 
「ついでに初期データも追加したい」と適当に1行追加しようとしてみます。  
できたマイグレーションファイルはこんな感じ。

    class Sample < ActiveRecord::Migration
      def up
        add_column :members, :age, :integer, null: false
    
        Member.create({ id: 99, name: '永井', age: 18 })
      end
    
      def down
        remove_column :member, :age
      end
    end

Memberテーブルに年齢を追加して、ついでに自分のデータを追加する処理ですね。  

これで実行するとこけます。なぜでしょうか。   
追加データの年齢を5歳ほど鯖読みしているからでしょうか。  
違いますね、すみません。  

エラーの内容を見てみると  
「ageなんてカラム知らん」とお怒りのご様子。  

なるほど、add_columnメソッドでDBにカラムを追加しただけで、  
モデルクラスはその情報を知らんのですね。  

と、言うわけでモデルクラスに追加したカラムを教えてやるための  
処理を入れてやれば動きました。ソースはこんな感じ。

    class Sample < ActiveRecord::Migration
      def up
        add_column :members, :age, :integer, null: false

        Member.connection.schema_cache.clear!
        Member.reset_column_information

        Member.create({ id: 99, name: '永井', age: 18 })
      end
    
      def down
        remove_column :member, :age
      end
    end

キャッシュを念入りに削除したのちに  
カラムのデータを入れてやってます。    
これで大丈夫ですね。

「初期データとかシードファイルでやれよ」って  
突っ込みが飛んできそうではありますが、  
マニアックなネタとして知って頂ければ幸いです。  

他にもコケたところはありますが    
それはまたの機会ということで。  
ありがとうございました。