Ruby on Rails种子数据

时间:2015-03-06 21:14:44

标签: ruby-on-rails ruby rails-console

我是Ruby / Rails的新手。我目前正在使用Rake和seeds.rb文件了解Rails控制台和数据库。

我应该:

  • 将具有唯一标题和正文的帖子添加到seeds.rb。
  • 在创建唯一帖子之前,请验证它是否存在于数据库中。只要 如果没有,请播种。
  • 运行rake db:seed几次,启动Rails控制台并确认 你的独特帖子只播种过一次。
  • 重复以创建唯一注释并确认它也是唯一的 种子一次。

老实说,我不知道如何开始这方面的工作。我应该使用rails控制台或者直接从seeds.rb文件添加帖子?任何指导将不胜感激。

2 个答案:

答案 0 :(得分:5)

尽管有seed - 意图 - 这意味着要运行一次,以填充数据库 - 没有技术限制阻止您多次运行rake db:seed命令。即使没有清理/重新创建数据库也是如此。

在这种情况下,请尝试使用 db / seeds.rb

的代码
post_atrributes = [
  { title: "Sample Title 1", body: "Sample body 1" },
  { title: "Sample Title 2", body: "Sample body 2" },
  { title: "Sample Title 3", body: "Sample body 3" },
]

post_attributes.each do |attributes|
  Post.create(attributes) unless Post.where(attributes).first
end

首先,我们要为每个要创建的Post定义一个属性数组。

稍后,我们正在遍历该数组(使用post_attributes.each do |attributes|),并尝试创建一个新的Post,除非找到具有指定属性的数据。

在Rails中,有一种非常奇特的方法first_or_create,它正是这样做的 - 查询数据库中的指定属性(where(attributes)),如果找不到任何内容 - 根据提供的属性创建新记录。

post_atrributes = [
  { title: "Sample Title 1", body: "Sample body 1" },
  { title: "Sample Title 2", body: "Sample body 2" },
  { title: "Sample Title 3", body: "Sample body 3" },
]

post_attributes.each do |attributes|
  Post.where(attributes).first_or_create
end

此时,您可以使用rake db:seed“播种”数据库,并通过以下方式检查数据库中存储的内容(在运行rails console之后):

Post.all.map(&:title)

假设您在运行rake db:seed之前有空数据库,它应该只包含3个Post。使用post_attributes中的属性指定的那些。

现在,如果您再次尝试修改 db / seeds.rb ,请再添加一个属性Post

post_atrributes = [
  { title: "Sample Title 1", body: "Sample body 1" },
  { title: "Sample Title 2", body: "Sample body 2" },
  { title: "Sample Title 3", body: "Sample body 3" },
  { title: "Another Post", body: "WOW!" },
]

post_attributes.each do |attributes|
  Post.where(attributes).first_or_create
end

运行rake db:seed后,检入控制台:

Post.all.map(&:title)

您可以看到,只创建了一个新的Post。标题为“另一个帖子”的那个。

在我的问题中,我了解到,在创建新Post时,两个属性 - titlebody都是唯一的,因此如果您尝试对以下属性执行相同的操作:< / p>

post_atrributes = [
  { title: "Sample Title 1", body: "Sample body 1" },
  { title: "Sample Title 1", body: "Sample body 2" },
]

这将创建两个单独的Post,因为它们定义了不同的body属性。

对于Comment你可以做类似的事情。

同样,正如前面提到的jBeas - seed - ing有不同的目的,但如果这只是练习ActiveRecord - 这是解决问题的方法之一。

希望有所帮助!

答案 1 :(得分:2)

Seeding是使用数据填充数据库的过程。

有两种方法可以实现这一目标。

您可以使用ActiveRecord Migrations

class AddInitialProducts < ActiveRecord::Migration
  def up
    5.times do |i|
      Product.create(name: "Product ##{i}", description: "A product.")
    end
  end

  def down
    Product.delete_all
  end
end

或者您可以将其存储在单独的seeds.rb文件

5.times do |i|
  Product.create(name: "Product ##{i}", description: "A product.")
end

之后,运行rake db:seed

来源

http://edgeguides.rubyonrails.org/active_record_migrations.html#migrations-and-seed-data