2015-03-06 6 views
3

Я рубин/Rails новичок. В настоящее время я изучаю консоль Rails и базы данных, используя Rake и файл seeds.rb.Ruby on Rails Seed Data

Я должен:

  • Добавить запись с уникальным названием и тела seeds.rb.
  • Перед созданием уникального сообщения проверьте его существование в базе данных. Только посередине сообщения, если это не так.
  • Запустите rake db: семя пару раз, запустите консоль Rails и подтвердите , что ваше уникальное сообщение было посещено только один раз.
  • Повторите, чтобы создать уникальный комментарий и подтвердить, что он также только посеялся один раз.

Честно говоря, я не знаю, как начать работать над этим. Я должен добавить сообщение, используя консоль rails или непосредственно из файла seeds.rb? Любые рекомендации будут высоко оценены.

+0

«Запустите rake db: seed пару раз», вы только когда-нибудь запустите это. – jBeas

+0

«Перед созданием уникального сообщения убедитесь, что он существует в базе данных, только семя, если оно нет». Это не имеет никакого смысла. Когда вы его создадите, вы заселяете БД. Фактически rake db: setup работает rake db: seed. Семена обеспечивают концепцию предварительного заполнения базы данных данными, зависящими от приложения, или «примерными данными» – jBeas

+0

Лицо, предоставившее вам эти инструкции, никогда не должно давать никаких инструкций. – jBeas

ответ

1

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

+1

Как показал вам Darkmouse, seeds.rb - обычный рубиновый файл, в который вы можете поместить любой код. Таким образом, вы можете также поставить код, который проверяет наличие сообщения или нет. Но если вы действительно хотите использовать проверки уникальности, я предлагаю создать модель Post и модель комментариев. – Klaus

5

Несмотря на намерение 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 - это один из способов решения этой проблемы.

Надеюсь, что это поможет!