Проблема миграции Weird Rails/schema.rb

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')

поскольку приборы пытаются загрузить в неправильную тестовую схему, которая была загружена только во время тестирования.

Ответ 1

После каждой миграции выполняется восстановленная из фактического состояния вашей базы данных. Поэтому я думаю, что pipelines_id действительно должен существовать где-то в вашем db или, по крайней мере, Rails должен думать, что он существует в db. Я бы сделал следующее, чтобы сузить проблему:

  • Запустите rake db:schema:dump SCHEMA=myschema.rb - это приведет к созданию файла с именованным именем. Это та же самая задача, которая также запускается после миграции. Я ожидаю, что новая схема будет содержать множественный столбец pipelines_id.

  • Затем я бы посмотрел в log/development.log (или в какой-либо среде, в которой вы столкнулись с проблемой). Вы должны увидеть SELECT schema_migrations.* FROM schema_migrations и кучу дополнительных запросов для отображения структуры каждой таблицы в вашей базе данных. Найдите запрос, который имеет дело с таблицей pipeline_specs, и запустите его вручную в консоли db, чтобы узнать, что именно вы получаете. Я ожидаю, что вы тоже:

    • см. также множественное число pipelines_ids - это докажет, что столбец действительно существует в db
    • или нет - в этом случае я перезапустил все, что мог, в рельсах, чтобы убедиться, что никакого кеширования не задействовано нигде - в частности, я перезапустил spring с помощью spring stop. Также я бы проверил (не знаю Postgres, что хорошо сказать наверняка) может ли быть кеширование вовлечено в сторону Postgres. Затем я попробую еще раз.

Ответ 2

Я думаю, что, поскольку перенос, который вы удалили, не запускался в тестовой среде, попробуйте reset тестовую базу данных:

RAILS_ENV=test rake db:migrate:reset

Ответ 3

Попробуйте указать foregein_key в модели PipelineSpec - pipelines_id

class PipelineSpec < ActiveRecord::Base
  belongs_to :pipeline, foreign_key: :pipelines_id
end