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..
本、映画など、ゲームと同じ構造に従うモデルが他にもあります。その場合WikipediaParagraph.paragraph == nil
、ゲームは検証に失敗します。has_one :wikipedia_paragraph, :validate => false
ゲームが保存され、WikipediaParagraphが保存されなかった場合は、どちらも保存せずに両方を保存したほうがいいと思います。
使うよりもエレガントなものが欲しいと思っていました
self.build_wikipedia_paragraph
self.wikipedia_paragraph = nil unless self.wikipedia_paragraph.valid?
has_one/many
今では、おそらく不可能だと気づきました。