我一直在阅读有关 rails 验证的信息,该validates_associated
方法验证所有子记录(不仅仅是新记录),而has_many
关联的默认验证仅保存新的子记录。
从概念上讲,我理解这一点,但我试图提出一个为什么子值无效的用例。例如,如果 a Movie
has_many
Ratings
,我为什么要编辑评级而不验证它?
有人可以提供一个实际的例子来说明哪里validates_associated
是必要的吗?
我一直在阅读有关 rails 验证的信息,该validates_associated
方法验证所有子记录(不仅仅是新记录),而has_many
关联的默认验证仅保存新的子记录。
从概念上讲,我理解这一点,但我试图提出一个为什么子值无效的用例。例如,如果 a Movie
has_many
Ratings
,我为什么要编辑评级而不验证它?
有人可以提供一个实际的例子来说明哪里validates_associated
是必要的吗?
让我们以与您提供的电影 has_many Ratings 相同的示例为例。如果您要与评分一起保存电影,并且评分有验证错误,则不应保存该电影。使用 validates_related 将有助于这一点 - 只有当它的孩子有效时,电影才会被保存。希望这可以帮助你
考虑Rating
有一个名为的字段score
,它必须是>= 0
and <= 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
.