Rails4では updated_at等がnot nullではなくなったらしい。

Rails4.0に更新した後にdb:migrate:resetを実行したらschema.rbのupdated_atやcreated_atからnull: falseがなくなった。
調べてみたらこんなコミットがあった。
読むと、テーブルを変更してタイムスタンプのカラムを追加するとNOT NULLのカラムには何らかの値が必要ということでエラーが発生するみたい。 これが解決できないのでRails4.0ではnull: falseがなくなったということだった。
ちなみにnull: falseがデフォルトで付くようになったのはRails3.2からなので、今回の変更でRails3.1以前に戻ったことになる。

RailsでのHash#sliceとHash#slice!の違い

Hash#slice!がHash#sliceを破壊的にしただけのメソッドだと勘違いしてしばらく悩んだ。

h = { a:1, b:2, c:3, d:4 }
h.slice(:c, :d) #=> {:c=>3, :d=>4}
h #=> {:a=>1, :b=>2, :c=>3, :d=>4}

h.slice!(:c, :d) #=> {:a=>1, :b=>2}
h #=> {:c=>3, :d=>4}
  • slice : 引数で指定したキーだけを含んだハッシュを返す。非破壊的。
  • slice! : レシーバのハッシュについて引数で指定したキー以外を削除し、削除した部分を返す。

ActiveModelのvalidatesメソッド

validates_xxx_ofメソッドが定義されているバリデーションは、すべてvalidatesメソッドでも使える。 ただ、書き方が少し違う。

validates_presence_of :name
validates :name, presence: true

また、validatesメソッドでもオプションは使えるので次のようにも書ける。

validates :name, presence: { message: "error message" }