gpt4 book ai didi

ruby-on-rails - 奇怪的 Rails 迁移/schema.rb 问题

转载 作者:行者123 更新时间:2023-12-04 02:27:06 26 4
gpt4 key购买 nike

不久前,我进行了以下迁移:

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

注意复数 管道 ID .实际的数据库表(开发、生产等)都是 管道 ID 这是正确的,因为引用表是 Pipeline .所以我添加了一个新的无关迁移和 schema.rb得到更新,这些在我改回来后又改回复数。如果我在运行测试时忘记更改它们,当错误的模式加载到测试环境中时,一切都会中断。

我在这里不知所措。我在这里遗漏了一些明显的东西,或者是否有一些隐藏的迁移模式表等。

我唯一能想到的是当我进行原始迁移时使用 pipelines:references对比 pipeline:references ,然后修复我的错误,然后在提交和部署它之前清理迁移。

这里有任何想法,为什么会发生这种情况以及如何一劳永逸地解决它?

更新

这是我的三个相关模型:
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 PipelineSpecPipelineSegment . PipelineSegment has_one PipelineSpec .

更新 2

检查了我的测试环境架构 - 很好。运行 rake db:migrate 并再次运行 schema.rb得到更新。再次运行测试并获得:
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')

因为夹具试图加载到刚刚在测试时加载的不正确的测试模式。

最佳答案

架构是 recreated from the actual state您的数据库 每次迁移运行后。所以我猜 pipelines_id必须确实存在于您的数据库中的某个地方,或者至少 Rails 必须认为它存在于数据库中。我会做以下事情来缩小问题的范围:

  • 运行 rake db:schema:dump SCHEMA=myschema.rb - 这将手动生成一个不同名称的架构文件。这与迁移后运行的 rake 任务相同。我希望新模式将包含复数 pipelines_id专栏也是。
  • 然后我会看看log/development.log (或您遇到问题的任何环境)。你应该看到 SELECT schema_migrations.* FROM schema_migrations和一堆进一步的查询,用于显示数据库中每个表的结构。查找处理 pipeline_specs 的查询table 并在 db 控制台中手动运行它以查看您准确获得的内容。我的期望是你要么:
  • 见复数 pipelines_ids那里也是 - 这将证明该列确实存在于数据库中
  • 与否 - 在这种情况下,我会在 rails 中重新启动所有可能的东西,以确保在任何地方都没有涉及缓存 - 特别是我会用 spring stop 重新启动 spring .此外,我会检查(不太了解 Postgres,无法确定)Postgres 方面是否涉及任何缓存。那我再试试。
  • 关于ruby-on-rails - 奇怪的 Rails 迁移/schema.rb 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43568730/

    26 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com