こんにちは、新卒1年目の永井です。
最近の悩みは花粉症で鼻が常にむずむずしていることです。
この時期はマスクを常に装着しています。
メガネが曇ります。
マスクを外します。
鼻がむずむずします。
以前、インターンシップについての記事を書かせて頂きましたが、
今回はRailsに関するエンジニアっぽいことを書きたいと思います。
…エンジニアなので!
…エンジニアなので!
あれですね、DBいじるヤツです。
そのマイグレーションを触る時にハマったことがあるので、
つらつらっと書いていきます。
Railsのバージョンは 4.1.8 です。
カラム追加とデータ追加を同時に行うとコケる
ID("id") と 名前("name") を持っている社員("Member")テーブルに 年齢("age") を追加して
カラム追加とデータ追加を同時に行うとコケる
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
キャッシュを念入りに削除したのちに
カラムのデータを入れてやってます。
これで大丈夫ですね。
「初期データとかシードファイルでやれよ」って
突っ込みが飛んできそうではありますが、
マニアックなネタとして知って頂ければ幸いです。
他にもコケたところはありますが
それはまたの機会ということで。
ありがとうございました。