Загрузка начальных данных в проект Rails 3

#ruby-on-rails #fixtures

#ruby-on-rails #приспособления

Вопрос:

До сих пор я использовал приспособления вместе с задачей rake для создания некоторых начальных данных для моей базы данных. Это сработало хорошо, но у меня внезапно возникли странные проблемы (например, получение автоматически созданных идентификаторов 1,2,3 .. в модели, а затем неправильных идентификаторов в модели объединения, из-за чего ассоциация вообще не работает).

Таким образом, мне было интересно, какая альтернатива лучше. Я читал о разных вещах, а также о railscast для начальных данных.

Мои данные на самом деле не содержат одинаковых фрагментов информации. Это похоже на отдельные записи, которые должны быть вставлены как есть. Например, подумайте, что я должен вставить 1000 пользователей, обладающих определенными способностями и скиллами. Для этого нужны некоторые модели объединения и некоторая аккуратная обработка ассоциаций, как это делают приспособления.

Итак, есть ли способ добиться этого лучше, чем приспособления?

Комментарии:

1. В какой форме у вас есть доступные данные?

2. теперь они у меня есть в виде приспособлений. Я хочу иметь возможность заполнять их, используя аналогичные методы.

Ответ №1:

Вот три разных варианта, которые я использую постоянно. Дайте мне знать, что вы думаете и как у вас дела. Всего наилучшего.

Суть Github >>

Комментарии:

1. Тем не менее, я не вижу, как должным образом обрабатываются ассоциации в этом.

2. Черт возьми, я использую стандартные приспособления. Вы можете указать ассоциации там. Вопрос в том, можете ли вы как-то сделать это другим, более правильным способом без приспособлений?

3. Есть ли шанс, что вы могли бы добавить схему, и я попробую это для вас

4. Спасибо 🙂 На самом деле я написал свою собственную начальную программу, которая прекрасно справляется со всем процессом. Возможно, я также загружу их на github.

Ответ №2:

Rails 3 предоставляет некоторые базовые возможности заполнения. Смотрите: http://ryandaigle.com/articles/2009/5/13/what-s-new-in-edge-rails-database-seeding

Подводя итог:

  • Вы можете поместить любой исходный код (на Ruby, используя ваши AR-модели) в db/seeds.rb
  • Затем запустите rake db:seed для загрузки этого ( rake db:setup делает это автоматически)

В моем файле seeds я обычно оборачиваю все в транзакцию, а также определяю идентификаторы вручную (при условии, что в базе данных нет существующих данных). Подсказка к драгоценному камню пролога. Пример:

 ActiveRecord::Base.transaction do
  if User.count == 0 amp;amp; Role.count == 0
    user = User.new :name => "Admin", :email => "admin@example.org", :password => "password", :password_confirmation => "password"
    user.id = 1
    user.save!
    user.confirmed_at = user.confirmation_sent_at
    user.save!

    role1 = Role.new :name => 'Admin'
    role1.id = 1
    role1.save!

    role2 = Role.new :name => 'Member'
    role2.id = 2
    role2.save!

    user.role_ids = [1,2]
    user.save!
  end
end
  

Могут быть лучшие способы сделать это!

В вашем случае вы могли бы загрузить данные из файла CSV или чего-то еще и создать объекты модели программно.

Комментарии:

1. проблема в том, что я не хочу определять идентификаторы вручную, а через ассоциации, как это делают приспособления.

2. Вам не нужно указывать идентификаторы. ActiveRecord (или db) автоматически назначит их.

3. Дело не в идентификаторах. Речь идет об ассоциациях. Например, элемент может иметь идентификатор пользователя. Приспособления предоставляют способ, при котором мне вообще не нужно с этим справляться.

Ответ №3:

Исправленный идентификатор может быть полезен для данных по умолчанию в базе данных. в случае с @ jits он не хочет, чтобы идентификатор и разрешение роли были перепутаны, идентификаторы должны быть исправлены и постоянно поддерживаться в нескольких средах или настройках.