2012-11-27 61 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' –