1

這裏是我的兩個型號:種子的has_many關係質量分配

class Article < ActiveRecord::Base 
    attr_accessible :content 
    has_many :comments 
end 

class Comment < ActiveRecord::Base 
    attr_accessible :content 
    belongs_to :article 
end 

和我想要使用此代碼種子數據庫中seed.rb:

Article.create(
    [{ 
     content: "Hi! This is my first article!", 
     comments: [{content: "It sucks"}, {content: "Best article ever!"}] 
    }], 
    without_protection: true) 

然而耙分貝:種子給我以下錯誤信息:

rake aborted! 
Comment(#28467560) expected, got Hash(#13868840) 

Tasks: TOP => db:seed 
(See full trace by running task with --trace) 

可以像這樣種子數據庫?

如果是後續問題:我搜索了一些,似乎要做這種類型的(嵌套?)批量分配,我需要爲要分配的屬性添加'accep_nested_attributes_for'。 (可能類似於評論模型中的'accep_nested_attributes_for:article')

有沒有辦法讓這個類似於'without_protection:true'?因爲我在接種數據庫時只想接受這種質量分配。

回答

4

您看到此錯誤的原因是,當您將關聯模型分配給其他模型(如@ article.comment = comment)時,預計右側是實際對象,而不是散列對象屬性。

如果你想在參數傳遞的註釋,以創建一篇文章,你需要在文章模型 accepts_nested_attributes_for :comments並添加:comments_attributesattr_accesible列表。

這應該允許你上面寫的東西。

我不認爲有條件的批量分配是可能的,因爲這可能會危害安全性(從設計角度來看)。

編輯:您還需要修改意見:[{content: "It sucks"}, {content: "Best article ever!"}]comments_attributes: [{content: "It sucks"}, {content: "Best article ever!"}]

+0

謝謝,它的工作原理。現在唯一的問題是不再需要「without_protection:true」。我並不喜歡公開更多的模型,只是爲了讓種子數據庫更方便:/ – rnd

+0

您在此處公開的唯一新屬性是:comment_attributes,並且因爲這些屬性僅轉發給Comment模型(其中唯一可訪問的屬性是:content),實際上並沒有比以前更多的模型。 – cdesrosiers

+0

換言之,:comments_attributes不是模型的真正組成部分,而是模型屬性的散列(無論如何都可以訪問)。 – cdesrosiers