1

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}を試しましたが、何もしません。

私は単純にモデルを保存して、関連するレコードがそれぞれ有効であればそれを保存しようとしますが、関連するモデルが無効な場合は失敗しません。


EDIT:これは私が

# 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は両方とも保存せず、保存も保存もしない。

私はすべてのhas_one/manyため

self.build_wikipedia_paragraph 
self.wikipedia_paragraph = nil unless self.wikipedia_paragraph.valid? 

を使用するよりもエレガントな何かを期待していたが、今、私はそのおそらくことはできません実現しています。

答えて

0

検証では、アプリケーションのビジネスロジックが強化されます。関連するコメントの状態にかかわらず、常にPostオブジェクトを保存したい場合は、投稿とコメントを個別に保存することができます。これは、コメントのコレクションを反復処理することを可能にし、上の各を保存しようとすると、エラー

post = Post.new 
post.valid? # true 

comments.each do |comment| 
    comment.save # some will some wont 
end 

がある場合、私はあなたがそれを記述する必要があり、これはまさにあなたの問題を解決しない知って続け、それでしょうアソシエーションの検証を無効にしたい理由を考えるとよいかもしれません。 has_many呼び出しでのvalidate => falseの問題は、検証なしで保存するということです。これは、意図したものではない可能性があります。

妥当性検査を行っている間にこの問題を解決するための正統な方法はありますか?

3

http://apidock.com/rails/ActiveRecord/Associations/ClassMethods/has_manyのドキュメントをご覧ください。これは、親オブジェクトが保存されるときにhas_many関連がデフォルトで有効であることを示しています。あなたはこのようなfalseに設定することができます

class Post < ActiveRecord::Base 
    has_many :comments, :validate => false 
end 

私はあなたがデフォルトで関連を検証し、それを自分で対処したいされていない場合validates_associatedが便利になる可能性があるとします。全体の状況はちょっと混乱しているので、これが役立つことを願っています。

関連する問題