种子has_many关系使用质量分配

时间:2012-06-10 22:19:48

标签: ruby-on-rails ruby ruby-on-rails-3 activerecord mass-assignment

以下是我的两个模型:

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'?因为我只想在播种数据库时接受这种质量分配。

1 个答案:

答案 0 :(得分:4)

您看到此错误的原因是,当您将关联模型分配给另一个模型时(如@ article.comment = comment),预计右侧是实际对象,而不是哈希对象属性。

如果要通过传入注释的参数来创建文章,则需要包括 文章模型中的accepts_nested_attributes_for :comments,并将:comments_attributes添加到attr_accesible列表。

这应该允许你上面写的内容。

我认为不可能进行条件性质量分配,因为这可能会危及安全性(从设计的角度来看)。

编辑:您还需要更改评论:[{content: "It sucks"}, {content: "Best article ever!"}]comments_attributes: [{content: "It sucks"}, {content: "Best article ever!"}]