Несмотря на намерение seed
-ing - это должно быть выполнено один раз, чтобы заполнить базу данных - нет никаких технических ограничений, препятствующих запуску команды rake db:seed
команды. Даже без очистки/воссоздания базы данных.
В этом случае, попробуйте следующий код для дб/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
.
Теперь, если вы пытаетесь изменить свой дб/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
s, потому что они имеют разные атрибуты body
.
Для Comment
s вы можете сделать аналогичную вещь.
Опять же, как указано в jBeas ранее - seed
-инг имеет другое назначение, но если это только упражнение для игры с ActiveRecord
- это один из способов решения этой проблемы.
Надеюсь, что это поможет!
«Запустите rake db: seed пару раз», вы только когда-нибудь запустите это. – jBeas
«Перед созданием уникального сообщения убедитесь, что он существует в базе данных, только семя, если оно нет». Это не имеет никакого смысла. Когда вы его создадите, вы заселяете БД. Фактически rake db: setup работает rake db: seed. Семена обеспечивают концепцию предварительного заполнения базы данных данными, зависящими от приложения, или «примерными данными» – jBeas
Лицо, предоставившее вам эти инструкции, никогда не должно давать никаких инструкций. – jBeas