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

Другие вопросы по тегам