1

これが私の2つのモデルです。

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 db:seedは次のエラーメッセージを表示します。

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

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

このようにデータベースをシードすることは可能ですか?

はいの場合、フォローアップの質問:いくつか検索しましたが、この種の(ネストされた?)一括割り当てを行うには、割り当てたい属性に「accepts_nested_attributes_for」を追加する必要があるようです。(おそらく、コメントモデルの'accepts_nested_attributes_for:article'のようなものです)

'without_protection:true'と同様にこれを許可する方法はありますか?データベースをシードするときに、この種の一括割り当てのみを受け入れたいからです。

4

1 に答える 1

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!"}]

于 2012-06-10T22:32:23.893 に答える