Rails 2.1.1での関連とバリデーションの話

from http://d.hatena.ne.jp/mat_aki/20080921/1221970970

Rails 2.1.xでは関連を作った場合のバリデーションの挙動がいろいろ変わっています。で、ぎゃーと言う声を見かけたのでIRCで相談してみました。私はどうもこういう使い方をしない癖がついていたらしく、あんまりはまりませんでした。

まとめると

  • たしかにRails 2.1.1で挙動が変わっている
  • 保存時に関連エンティティのバリデーションをするにはhas_many宣言なんかで:validateパラメータを指定する
  • 関連の種類とvalidateパラメータのデフォルトは次の通り
    • has_manyはデフォルトtrue
    • has_oneはデフォルトfalse
    • belongs_toもデフォルトfalse
    • habtmは調べてないww

以下IRCのログを転載。松田さんおめでとうございます。

16:17 morohashi: rails2.1.1でvalidates_associatedしてない関連のバリデーションエラーが伝播しなくなってるぽくて
16:17 morohashi: 個人的には納得なんですが、
16:18 morohashi: この辺の経緯を知ってる方いませんか?
16:18 morohashi: http://d.hatena.ne.jp/mat_aki/20080921/1221970970
16:18 a_matsuda: それなんか関連の定義をするときに引数が指定できるようになってますよ。
16:18 morohashi: ↑参考
16:18 morohashi: ほほう。
16:18 morohashi: 松田さんだー。おひさしぶりです
16:19 a_matsuda: お久しぶりですー。育児的寝不足でヤバいですw
16:19 xibbar_: 懐かしい。
16:20 morohashi: www
16:20 morohashi: 最初の1ヶ月を乗り切ればけっこう楽に
16:20 a_matsuda: おー。マジですか。それはよかった。
16:21 a_matsuda: ちょっとどのあたりのチケットだったか忘れたんですが、
16:21 a_matsuda: これかなぁ。 http://rails.lighthouseapp.com/projects/8994/tickets/483-automatic-validation-on-has_many-should-not-be-performed-twice
16:21 morohashi: なるほど:validateパラメータですな
16:21 morohashi: has_manyはデフォルトtrueで
16:21 morohashi: has_oneはデフォルトfalseか
16:21 morohashi: mumumu
16:22 a_matsuda: そもそも 2.1.0での挙動がバグでしょ、っていう指摘があって、こんなふうに落ち着いたと記憶してます。
16:22 morohashi: belongs_toもfalseか。
16:22 morohashi: どんな挙動でしたっけ? > 2.1.0
16:25 a_matsuda: 関連してるmodelがvalidじゃなかったら必ずvalid?がfalseになって、なんかsaveする順序とかによってはハマるケースがあったとかそんなだったような。
16:26 a_matsuda: うろ覚えです、すいません。
16:27 morohashi: これかー
16:27 morohashi: http://rails.lighthouseapp.com/projects/8994/tickets/301
16:27 morohashi: なるhどお。
16:28 a_matsuda: 2.1.0でこれの実装が取り込まれた副作用、っていうことだったみたいですね。 http://dev.rubyonrails.org/ticket/10518
16:30 morohashi: なるほどなるほど。自分がはまらなかった理由を含めて納得。前の挙動は仕様だと思ってた
16:30 a_matsuda: そしてARの関連のオプションがますます複雑になっていくという・・・
16:30 morohashi: ですねーーー