繁体   English   中英

Ruby on Rails种子数据

[英]Ruby on Rails Seed Data

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

我应该:

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

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

尽管有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 ,除非找到具有指定属性的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都是唯一的,所以如果你尝试对以下属性执行相同的操作:

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

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

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

再次,正如jBeas之前提到的 - seed有不同的目的,但如果这只是练习与ActiveRecord一起玩 - 这是你解决问题的方法之一。

希望有所帮助!

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM