#ruby-on-rails #fixtures
#ruby-on-rails #приспособления
Вопрос:
До сих пор я использовал приспособления вместе с задачей rake для создания некоторых начальных данных для моей базы данных. Это сработало хорошо, но у меня внезапно возникли странные проблемы (например, получение автоматически созданных идентификаторов 1,2,3 .. в модели, а затем неправильных идентификаторов в модели объединения, из-за чего ассоциация вообще не работает).
Таким образом, мне было интересно, какая альтернатива лучше. Я читал о разных вещах, а также о railscast для начальных данных.
Мои данные на самом деле не содержат одинаковых фрагментов информации. Это похоже на отдельные записи, которые должны быть вставлены как есть. Например, подумайте, что я должен вставить 1000 пользователей, обладающих определенными способностями и скиллами. Для этого нужны некоторые модели объединения и некоторая аккуратная обработка ассоциаций, как это делают приспособления.
Итак, есть ли способ добиться этого лучше, чем приспособления?
Комментарии:
1. В какой форме у вас есть доступные данные?
2. теперь они у меня есть в виде приспособлений. Я хочу иметь возможность заполнять их, используя аналогичные методы.
Ответ №1:
Вот три разных варианта, которые я использую постоянно. Дайте мне знать, что вы думаете и как у вас дела. Всего наилучшего.
Комментарии:
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 он не хочет, чтобы идентификатор и разрешение роли были перепутаны, идентификаторы должны быть исправлены и постоянно поддерживаться в нескольких средах или настройках.