[英]Ruby on Rails Seed Data
我是Ruby / Rails的新手。 我目前正在使用Rake和seeds.rb文件了解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
,两个属性 - title
和body
都是唯一的,所以如果你尝试对以下属性执行相同的操作:
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.