rake db: заселять ключи при засевании - PullRequest
1 голос
/ 01 апреля 2012

У меня есть данные о состоянии в txt-файле, который я использовал для заполнения моей базы данных States, в которой есть столбцы: id и: name. имя: 2-значный код состояния. Использовал следующий код в файле seed.rb:

State.delete_all
open("C:/Sites/rails_projects/sales_tracking/lib/assets/states.txt") do |states|
  states.read.each_line do |state|
  name = state
  State.create!(:name => name)
 end
end

Теперь у меня есть файл Cities.txt с данными о городе, штате. В базе данных моих городов есть столбцы: id,: name,: state_id. : state_id - это внешний ключ из таблицы состояний. Какой код мне нужно добавить в приведенную ниже часть моего файла seed.rb, чтобы заполнить: state_id при запуске rake db: seed для данных города seed («code» - это двузначный идентификатор состояния).

City.delete_all
open("C:/Sites/rails_projects/sales_tracking/lib/assets/cities.txt") do |cities|
  cities.read.each_line do |city|
    name, code = city.chomp.split(",")
     ??
    City.create!(:name => name, :state_id => state_id)
  end
end

1 Ответ

2 голосов
/ 01 апреля 2012

Используйте динамический искатель, чтобы получить состояние:

City.create!(:name => name, :state => State.find_by_name(code))

Или, если вы хотите избежать нескольких запросов, и если код состояния гарантированно существует, вы можете отслеживать состояниякогда вы отбираете их в хэш и используете их для городов:

State.delete_all
City.delete_all

@states = {}

open("states.txt").read.each_line do |code|
  @states[code] = State.create!(:name => code)
end

open("cities.txt").read.each_line do |city|
  name, code = city.chomp.split(",")
  City.create!(:name => name, :state => @states[code])
end
...