我是Ruby / Rails的新手。我目前正在使用Rake和seeds.rb文件了解Rails控制台和数据库。
我应该:
老实说,我不知道如何开始这方面的工作。我应该使用rails控制台或者直接从seeds.rb文件添加帖子?任何指导将不胜感激。
答案 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
时,两个属性 - title
和body
都是唯一的,因此如果您尝试对以下属性执行相同的操作:< / 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