1

Вот мои две модели:Seed 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) 

Однако грабли БД: 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» для модели Comment)

Есть ли способ разрешить это похожее на «без_защиты: истина»? Потому что я хочу только принять это массовое назначение при посеве базы данных.

ответ

4

Причина, по которой вы видите эту ошибку, заключается в том, что при назначении связанной модели другой модели (как в @ article.comment = comment) ожидается, что правая сторона будет фактическим объектом, а не хешем атрибуты объекта.

Если вы хотите создать статью, передавая параметры для комментария, вам необходимо включить accepts_nested_attributes_for :comments в модели статьи и добавить :comments_attributes к attr_accesible списку.

Это должно учитывать то, что вы написали выше.

Я не считаю возможным условное массовое присвоение, поскольку это может поставить под угрозу безопасность (с точки зрения дизайна).

EDIT: Кроме того, необходимо изменить комментарии: [{content: "It sucks"}, {content: "Best article ever!"}] к comments_attributes: [{content: "It sucks"}, {content: "Best article ever!"}]

+0

Спасибо, это работает. Единственная проблема в том, что «no_protection: true» больше не требуется. Мне не очень нравится подвергать большую часть модели, чем нужно, чтобы сделать ее более удобной для посева базы данных:/ – rnd

+0

Единственный новый атрибут, который вы раскрываете здесь: comment_attributes, и так как они просто перенаправлены в модель комментариев (где единственным доступным атрибутом является: content), вы на самом деле не показываете больше моделей, чем раньше. – cdesrosiers

+0

Другими словами: comments_attributes на самом деле не является частью модели, скорее это хэш атрибутов модели (которые в любом случае доступны). – cdesrosiers