默认情况下,Rails3是否始终针对所有模型运行validates_associated
?ActiveModel:关联模型失效时禁用验证失败
在一个简单的设置像这样
class Post < ActiveRecord::Base
has_many :comments
end
class Comment < ActiveRecord::Base
belongs_to :post
def validate
errors.add_to_base("its always invalid")
end
end
发新帖附加注释失败,因为评论是无效的。
a = Post.new
a.comments << Comment.new
a.errors
=> {:comments=>["is invalid"]}
如果validates_associated
始终运行,那么为什么它有(改变:message
?),我如何把它关掉?我试过validates_associated :comments, :unless => proc{true}
,但它什么也没做。
我只是想要一个模型来保存,尝试保存每个关联的记录,如果每个都是有效的,但如果关联模型无效则不会自行失效。
编辑:这是更接近我想要做
# t.string :name
class Game < ActiveRecord::Base
has_one :wikipedia_paragraph
has_one :ign_rating
def name=(_name)
ret = super
self.build_wikipedia_paragraph
self.build_ign_rating
ret
end
end
# t.text :paragraph
class WikipediaParagraph < ActiveRecord::Base
belongs_to :game
validates_presence_of :paragraph
def game=(_game)
ret = super
self.paragraph = Wikipedia.find(self.game.name)
ret
end
end
class IgnRating..
有迹象表明,遵循相同的结构游戏,像书籍,电影更多的车型。如果WikipediaParagraph.paragraph == nil
则游戏未通过验证。我宁愿如果游戏保存和WikipediaParagraph没有,但has_one :wikipedia_paragraph, :validate => false
使两个保存,没有它既不保存。
我希望的东西比使用
self.build_wikipedia_paragraph
self.wikipedia_paragraph = nil unless self.wikipedia_paragraph.valid?
为每has_one/many
更优雅,但现在我意识到它可能是不可能的。