我一直在阅读有关rails验证的信息,validates_associated
方法验证所有子记录(不仅仅是新记录),而has_many
关联的默认验证只是保存新的子记录
从概念上讲,我理解这一点,但我正在尝试提出一个用例,说明为什么子值无效。例如,如果Movie
has_many
Ratings
,我为什么要编辑评分而不验证呢?
有人可以提供实际需要validates_associated
的例子吗?
答案 0 :(得分:1)
让我们采用与您提供的电影has_many评级相同的示例。如果您要将电影与评分一起保存,并且评级有验证错误,则不应保存电影。使用validates_associated将有助于此 - 只有在其子项有效时才会保存电影。希望这可以帮助你
答案 1 :(得分:0)
考虑Rating
有一个名为score
的字段,必须是>= 0
和<= 5
。
在rails console
:
>> m = Movie.first
=> #<Movie id: 1, name: "Lord of the Rings">
>> r = m.ratings.first
=> #<Rating id: 1, score: 5>
>> m.valid?
=> true
>> r.valid?
=> true
>> r.score = -1
=> -1
>> r.valid?
=> false
如果您不使用validates_associated
:
>> m.valid?
=> true
如果您使用validates_associated
:
>> m.valid?
=> false
>> m.errors.messages
=> {:ratings => ["is invalid"]}
但是,如果您不使用validates_associated
,则在运行m.save
时,只会更新电影记录,但不会更新相关评级。因此,如果您不使用validates_associated
,我就不会有任何伤害。