在Rails 3项目中加载种子数据

时间:2011-05-29 10:23:39

标签: ruby-on-rails fixtures

到目前为止,我一直在使用Fixtures以及rake任务为我的数据库创建一些种子数据。这很好用,但我突然遇到了奇怪的问题(比如在模型中获取1,2,3 ..的自动ID,然后在连接模型中输入错误的ID,使得关联根本不起作用)。

因此,我想知道更好的选择是什么。我已经阅读了不同的内容,以及有关种子数据的轨道广播。

我的数据并不真正共享相同的信息。这就像是必须按原样插入的单独条目。例如,认为我必须插入1000个具有特定能力和技能的用户。这需要一些连接模型和一些巧妙的关联处理,如灯具。

那么,有没有比灯具方法更好的方法呢?

3 个答案:

答案 0 :(得分:3)

以下是我一直使用的三种不同选项。让我知道你的想法以及你的成就。一切顺利。

Github Gist >>

答案 1 :(得分:2)

Rails 3提供了一些基本的播种功能。请参阅:http://ryandaigle.com/articles/2009/5/13/what-s-new-in-edge-rails-database-seeding

总结:

  • 您可以在db/seeds.rb
  • 中添加任何种子代码(在Ruby中,使用您的AR模型)
  • 然后运行rake db:seed加载此项(rake db:setup自动执行此操作)

在我的种子文件中,我倾向于在事务中包装所有内容,并且还手动定义ID(假设数据库中没有现有数据)。帽子提示到Prologue gem。例如:

ActiveRecord::Base.transaction do
  if User.count == 0 && Role.count == 0
    user = User.new :name => "Admin", :email => "admin@example.org", :password => "password", :password_confirmation => "password"
    user.id = 1
    user.save!
    user.confirmed_at = user.confirmation_sent_at
    user.save!

    role1 = Role.new :name => 'Admin'
    role1.id = 1
    role1.save!

    role2 = Role.new :name => 'Member'
    role2.id = 2
    role2.save!

    user.role_ids = [1,2]
    user.save!
  end
end

可能有更好的方法来做到这一点!

在您的情况下,您可以从CSV文件或其他东西加载数据,并以编程方式创建模型对象。

答案 2 :(得分:0)

固定ID可能对数据库中的默认数据有用。在@jits的情况下,他不希望ID和角色权限搞砸,需要在几个环境或设置中不断修复和维护ID。