rake db:seed заполнять ключи при семени

У меня есть данные о состоянии в текстовом файле, который я использовал для заполнения базы данных состояний, в которой есть столбцы: id и: name. :name — это двухзначный код штата. Использовал следующий код в файле 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 для начальных данных города («код» — это двухзначный идентификатор состояния).

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

person user1241965    schedule 01.04.2012    source источник


Ответы (1)


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

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
person Thilo    schedule 01.04.2012
comment
Это сработало отлично! Второй вариант, который вы представили, был быстрее. Большое спасибо. - person user1241965; 01.04.2012