默认情况下, Rails3 是否总是validates_associated
针对所有模型运行?
在这样的简单设置中
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..
还有更多模型遵循与 Game 相同的结构,例如 Book、Movie。如果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
,但现在我意识到这可能是不可能的。