0

私のモデルとその関連は次のとおりです。

class Post < ActiveRecord::Base
  has_many :comments
end

class Comment < ActiveRecord::Base
  belongs_to :post
  validates :commenter, :presence => true
end

ケース1:以下のコードを試してみると、自動的にsaveメソッドが呼び出されます。

@post = Post.find(3)
@comments = @post.comments
p @comments #=> []
p @comments.class #=> Array
if @comments.empty?
  3.times do
    @comments << @post.comments.build
 end
end
p @comments.first.errors #=>{:commenter=>["can't be blank"]}

ケース2:同じ空の配列を@commentsに手動で初期化すると、自動保存が呼び出されません。例えば、

p @comments #=> []
p @comments.class #=> Array
if @comments.empty?
  @comments = []
  p @comments #=> []
  3.times do
    @comments << @post.comments.build
  end
end
p @comments.first.errors #=>{}

自動保存を回避するための最良の解決策は何ですか?上記のコードの動作が異なる理由を誰かに説明してください。

4

2 に答える 2

2

Rails はモンキー パッチを広く使用しているため、Rails 配列は純粋な Ruby 配列とは異なります。irb > [].methods(と の出力を比較します。rails c > [].methods

資料 収集 <<方法によるhas_many

親オブジェクトの保存または更新の呼び出しを待たずに、update sql を即座に起動します。

そのため、おそらく Rails にはコレクション イベントの「オブザーバー」があり、新しいオブジェクトを追加しようとすると検証が開始されます。

2 番目のスニペットでは、(コレクションではなく) 純粋な配列を使用has_manyしているため、更新アクションは実行されません。

<<まったく必要のない更新アクションを回避するには

@post = Post.find(3)
@comments = @post.comments
if @comments.empty?
  3.times do
    @post.comments.build
 end
end
p @comments.size
=> 3
于 2012-11-27T13:16:21.773 に答える
0

自動保存は Post モデルで定義されています。自動保存についてはこちらをご覧ください。あなたの質問を正しく理解できれば、 を定義するだけで十分:autosave => falseです。

于 2012-11-27T10:24:10.590 に答える