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" }