У меня есть созданная скаффолдами модель под названием «Pac» (комитет политических действий), у которой есть временные метки.
Я пытаюсь собрать данные о пакетах из текстового файла.В моем файле seed.rb я анализирую текстовый файл, чтобы получить хэш данных, соответствующий атрибутам моего класса ActiveRecord :: Pac.Этот хэш называется 'pac_attributes'.
Теперь я пытаюсь
Pac.find_or_create_by(pac_attributes)
и получаю следующую ошибку:
SQLite3::ConstraintException: NOT NULL constraint failed: pacs.created_at
Ну, ActiveRecord :: Pac имеет метки времени, и и мой хэш 'pac_attributes' не имеет явных записей для 'create_at' и 'updated_at', но каждый раз, когда я когда-либо использовал find_or_create_by в прошлом, эти поля генерируются автоматически (как и поле 'id').
Что происходит?Почему «find_or_create_by» завершается с ошибкой и выдает эту ошибку?
По запросу комментаторов я добавил следующую информацию:
Выдержка из файла schema.rb:
create_table "pacs", force: :cascade do |t|
t.string "cycle"
t.string "fec_id"
t.string "pacshort"
t.string "affiliate"
t.string "ultorg"
t.string "recipient_id"
t.string "recipient_code"
t.string "fec_candidate_id"
t.string "party"
t.string "prim_code"
t.string "source"
t.string "sensitive"
t.boolean "foreign"
t.integer "active"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
Чтобы получить хеш 'pac_attributes', я делаю следующее:
pac_columns = Pac.column_names
pac_columns.delete_if { |x| x=='id' or x=='created_at' or x=='updated_at' }
puts pac_columns
pacs = File.join(Rails.root, 'app', 'assets', 'tables', 'cmtes18.txt' )
IO.foreach(pacs) do |line|
line.chomp!("\r\n")
pac_data = line.split(',')
pac_data.each do |data|
data.gsub!(/\|/,"")
#The textfile is formatted with entries comma-separated and enclosed in '|' characters
end
pac_attributes = pac_columns.map(&:to_sym).zip(pac_data).to_h
pac_attributes.delete_if{|_,v| v=="" }
puts pac_attributes
pac = Pac.find_or_create_by(pac_attributes)
end
'возвращает pac_attributes':
{:cycle=>"2018", :fec_id=>"C00000018", :recipient_id=>"C00000018", :fec_candidate_id=>"H8TX22313", :foreign=>"0", :active=>"0"}
Журналы разработки возвращают следующее:
[1m[36mPac Load (0.1ms)[0m [1m[34mSELECT "pacs".* FROM "pacs" WHERE "pacs"."cycle" = ? AND "pacs"."fec_id" = ? AND "pacs"."recipient_id" = ? AND "pacs"."fec_candidate_id" = ? AND "pacs"."foreign" = ? AND "pacs"."active" = ? LIMIT ?[0m [["cycle", "2018"], ["fec_id", "C00000018"], ["recipient_id", "C00000018"], ["fec_candidate_id", "H8TX22313"], ["foreign", "0"], ["active", 0], ["LIMIT", 1]]
[1m[35m (0.1ms)[0m [1m[36mbegin transaction[0m
[1m[35mSQL (0.4ms)[0m [1m[32mINSERT INTO "pacs" ("cycle", "fec_id", "recipient_id", "fec_candidate_id", "foreign", "active") VALUES (?, ?, ?, ?, ?, ?)[0m [["cycle", "2018"], ["fec_id", "C00000018"], ["recipient_id", "C00000018"], ["fec_candidate_id", "H8TX22313"], ["foreign", "f"], ["active", 0]]
[1m[35m (0.0ms)[0m [1m[31mrollback transaction[0m