Всегда ли 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
но теперь я понимаю, что это, вероятно, невозможно.