2012-11-27 62 views
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 #=>{} 

什么是避免自动保存,并请任何一个解释为什么上面的代码不同的表现最佳的解决方案?

回答

1

滑轨广泛使用猴修补,所以导轨阵列是不一样的东西作为纯Ruby阵列。 (从irb > [].methodsrails c > [].methods

比较输出根据documentation方法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 
+0

@ dimuch-:给了明确的解释和工作液的感谢。 –

0

自动保存在Post模型定义。阅读here关于自动保存。如果我正确理解你的问题,那么它应该足以定义:autosave => false

+1

感谢答复@davidrac在需要<<更新动作。我试过:autosave => false关联但没有改变。 –

+0

你能分享新的代码吗?顺便说一句,你共享的代码示例在哪里运行?这段代码:'@comments << @ post.comments.build'中有其他问题,无关自动保存... – davidrac

+0

我在岗位模型中设置自动保存选项,因为假如 '类岗位<的ActiveRecord :: Base的 的has_many:评论:自动保存=>假 end' –