【发布时间】:2011-10-04 19:45:00
【问题描述】:
默认情况下 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 则 Game 验证失败。我希望游戏保存而 WikipediaParagraph 没有保存,但has_one :wikipedia_paragraph, :validate => false 会同时保存,没有它则不会保存。
我希望有比使用更优雅的东西
self.build_wikipedia_paragraph
self.wikipedia_paragraph = nil unless self.wikipedia_paragraph.valid?
对于每个has_one/many,但现在我意识到这可能是不可能的。
【问题讨论】:
标签: ruby-on-rails validation activerecord activemodel validates-associated