2014-10-24 2 views
1

Я новичок в рельсах, и я не смог найти окончательного ответа на этот вопрос.Что происходит, когда вы запускаете rake: db seed дважды?

Скажем, у меня есть

Project.create!([{title: "foo", description: "bar"}]) 

в моем файле seeds.rb, а затем запустить

$rake db:seed 

дважды. Было бы две почти идентичные записи в базе данных или переопределить начальную запись?

+2

Почему бы вам не запустить его дважды и проверить его на db? – Doguita

+0

@Doguita У меня есть много несезонных данных в базе данных, которые потребовались некоторое время, чтобы туда попасть. Я не хочу бросать дБ, если что-то пойдет не так. Кроме того, я думал, что это будет хорошо для таких людей, как я (читай: noobs), чтобы иметь возможность найти ответ, не пытаясь потенциально обмануть их базы данных. – VoA

+1

Я понимаю. Но когда у меня возникает такой вопрос, я просто создаю новое приложение для рельсов и делаю некоторые тесты. – Doguita

ответ

4

Он будет дублировать.

Если вы хотите запускать несколько раз, но не допускайте дублирования. Я думаю, вы могли бы:

  1. Использование проверки в одном ключевом поле, как положить validate_uniqueness_of :key_attribute
  2. испытания счетчик вашей таблицы, как:

    MyClass.create if MyClass.count == 0

  3. лучшее решение может быть использовать find_or_create_by способ. См. De docs: http://easyactiverecord.com/blog/2014/03/24/using-find-or-create-with-multiple-attributes/

+0

Спасибо, что я искал. И хороший совет по проверке уникальности. Хотелось бы, чтобы я мог поддержать вас, но, к сожалению, я до сих пор не был 15-летним представителем. Cheers – VoA

3

Он просто запускает файл. Rails ничего не делает для вас, поскольку предотвращает создание дублированных данных семян. Если ваш файл создает запись, он будет пытаться создать эту запись при каждом посещении. Это полностью зависит от вас, чтобы предотвратить это, если вы не хотите дублировать данные семени.

Если вы хотите создать запись, если она уже не существует, используйте find_or_create_by:

Project.find_or_create_by_title_and_description "foo", "bar" 

Это создаст Project с указанным заголовком и описанием, если он уже не существует, что позволяет запускать rake db:seed столько раз, сколько вы хотите, не создавая дубликатов.

+0

VoA, посмотрите также на решение meagar. Я думаю, что он чище и должен решить вашу проблему. Я отредактирую мой, чтобы закончить информацию. –

+0

Полезно знать. Я бы подумал, что есть какая-то рельсовая магия, которая может помешать или запутаться с основным исполнением рубина в seeds.rb, но на самом деле это упрощает дело без такого скрытого кода. Благодаря! – VoA

+0

@VoA Rails не может предположить, что он подходит для создания только одной уникальной записи. Ваш файл семени может создавать 50 поддельных «сообщений» каждый раз, когда он запускается, и вы можете создать 250 поддельных сообщений, запустив их 5 раз. – meagar

Смежные вопросы