Ruby on Rails Seed Data
Я новичок по Ruby/Rails. В настоящее время я изучаю консоль Rails и базы данных, используя Rake и файл seed.rb.
Я должен:
- Добавьте сообщение с уникальным названием и телом в seed.rb.
- Перед созданием уникального сообщения убедитесь, что оно существует в базе данных. Только посеять пост, если это не так.
- Запустите rake db: seed пару раз, запустите консоль Rails и убедитесь, что ваш уникальный пост был заселен только один раз.
- Повторите для создания уникального комментария и подтвердите, что он также добавлен только один раз.
Честно говоря, я не знаю, как начать работать над этим. Я должен добавить сообщение с помощью консоли rails или напрямую из файла seed.rb? Любое руководство будет с благодарностью.
2 ответа
Despite the intention of seed
-ing - that this is meant to be run once, to populate the database - there is no technical constrain preventing you from running rake db:seed
command couple times. Even without cleaning/recreating your database.
In that case, try following code for 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
First of all, we're defining an array of attributes for each Post
, to be created.
Later, we're iterating through that array (with post_attributes.each do |attributes|
), and trying create a new Post
, unless one with specified attributes found.
В 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
s. Те, которые указаны с атрибутами в post_attributes
,
Теперь, если вы попытаетесь изменить свой db / seed.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