0

我的模型及其关联是:

class Post < ActiveRecord::Base
  has_many :comments
end

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

案例1:当我尝试下面的代码时,调用了自动保存方法。

@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 Array 与纯 Ruby 数组不同。(比较输出irb > [].methodsrails c > [].methods

根据收集 的文件 <<方法has_many

立即触发更新 sql,而无需等待父对象上的保存或更新调用

因此,Rails 很可能有一个收集事件的“观察者”,并在您尝试添加新对象时触发验证。

在第二个片段中,您使用纯数组(不是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 回答