A назад назад я выполнил следующую миграцию:
class CreatePipelineSpecs < ActiveRecord::Migration
def change
create_table :pipeline_specs do |t|
t.integer :id_no
t.string :od
t.string :wt
t.string :material
t.string :spec_type
t.string :spec_grade
t.string :mop
t.string :stress_level
t.string :joints
t.text :notes
t.string :ip
t.references :pipeline, index: true, foreign_key: false
t.timestamps null: false
end
add_index :pipeline_specs, :id_no
end
end
Я не уверен, что произошло сейчас, но каждый раз, когда я запускаю rake db:migrate
, файл scheme.rb
обновляется:
create_table "pipeline_specs", force: :cascade do |t|
t.integer "id_no"
t.string "od"
t.string "wt"
t.string "material"
t.string "spec_type"
t.string "spec_grade"
t.string "mop"
t.string "stress_level"
t.string "joints"
t.text "notes"
t.string "ip"
t.integer "pipelines_id"
t.datetime "created_at", null: false
t.datetime "updated_at", null: false
end
add_index "pipeline_specs", ["id_no"], name: "index_pipeline_specs_on_id_no", using: :btree
add_index "pipeline_specs", ["pipelines_id"], name: "index_pipeline_specs_on_pipelines_id", using: :btree
Обратите внимание на множественное число pipelines_id. Фактические таблицы базы данных (dev, production и т.д.) - это все pipe_id, что является правильным, поскольку эталонная таблица Pipeline
. Поэтому я добавляю новую несвязанную миграцию и обновляется schema.rb
, и после ее изменения они снова возвращаются к множественному количеству. Если я забыл изменить их, когда я запускаю тесты, все прерывается, когда неправильная схема загружается в тестовую среду.
Я здесь в затруднении. Я пропущу что-то очевидное здесь или есть таблица скрытых схем миграции и т.д.
Единственное, что я могу сделать, - это когда я сделал первоначальную миграцию, я использовал pipelines:references
vs pipeline:references
, затем исправил свою ошибку, а затем очистил миграцию, прежде чем совершать это и развертывать.
Есть ли какие-нибудь идеи, почему это происходит и как их исправлять раз и навсегда?
UPDATE
Вот мои три связанные модели:
irb(main):031:0> Pipeline
=> Pipeline(id: integer, licence: string, company: string, company_id: integer, ba_code: string, substance_code: string, substance: string, h2s: string, partial_pressure: string, notes: text, created_at: datetime, updated_at: datetime, slug: string)
irb(main):032:0> PipelineSpec
=> PipelineSpec(id: integer, id_no: integer, od: string, wt: string, material: string, spec_type: string, spec_grade: string, mop: string, stress_level: string, joints: string, notes: text, ip: string, pipeline_id: integer, created_at: datetime, updated_at: datetime, slug: string)
irb(main):033:0> PipelineSegment
=> PipelineSegment(id: integer, line: integer, lsd_from: integer, sec_from: integer, twp_from: integer, rge_from: integer, m_from: integer, fc_from: string, lsd_to: integer, sec_to: integer, twp_to: integer, rge_to: integer, m_to: integer, fc_to: string, length: string, aasm_state: string, state_comment: string, state_user_id: integer, aasm_date: datetime, env: string, volume: string, notes: text, pipeline_id: integer, pipeline_spec_id: integer, created_at: datetime, updated_at: datetime, slug: string)
Pipeline
has_many PipelineSpec
и PipelineSegment
. PipelineSegment
has_one PipelineSpec
.
ОБНОВЛЕНИЕ 2
Проверял мою схему тестовой среды - это нормально. Ran rake db: migrate и снова обновляется schema.rb
. Запустите тесты еще раз и получите gobs:
ActiveRecord::StatementInvalid: ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR: column "pipeline_id" of relation "pipeline_specs" does not exist
LINE 1: ..., "mop", "stress_level", "joints", "notes", "ip", "pipeline_...
^
: INSERT INTO "pipeline_specs" ("id", "id_no", "od", "wt", "material", "spec_type", "spec_grade", "mop", "stress_level", "joints", "notes", "ip", "pipeline_id", "created_at", "updated_at") VALUES (1, 1, '88.9', '3.18', 'S', 'Z245.1', '359 2', '9930', '25', 'W', 'MyText', 'U', 1, '2017-04-24 03:47:26', '2017-04-24 03:47:26')
поскольку приборы пытаются загрузить в неправильную тестовую схему, которая была загружена только во время тестирования.