【问题标题】:PG::UndefinedColumn: ERROR: column "city_id" of relation "events" does not existPG::UndefinedColumn:错误:关系“事件”的列“city_id”不存在
【发布时间】:2016-01-23 11:39:16
【问题描述】:

我可以做些什么来解决这个错误?

我尝试用

添加列
    rails generate migration AddCityIdToEvents city_id:integer

但运行后它仍然给我同样的错误 bundle exec rake db:迁移

  == 20150925035910 ChangeIdTypes: migrating ====================================
  -- change_column(:connections, :identity_id, "integer USING CAST(identity_id    AS integer)")
     -> 0.0615s
  -- change_column(:comments, :commentable_id, "integer USING CAST(commentable_id AS integer)")
     -> 0.0203s
  -- change_column(:events, :city_id, "integer USING CAST(city_id        AS integer)")
  rake aborted!
  StandardError: An error has occurred, this and all later migrations canceled:

  PG::UndefinedColumn: ERROR:  column "city_id" of relation "events" does not exist
  : ALTER TABLE "events" ALTER COLUMN "city_id" TYPE integer USING CAST(city_id        AS integer)

这是我的模型:

  class Event < ActiveRecord::Base
      include PgSearch
      multisearchable :against => [:name, :description]

      nilify_blanks before: :validation

      belongs_to :host,        class_name: "User"
      has_many   :comments,    as: :commentable
      has_many   :votes,       as: :votable
      validates  :name,        presence: true
      validates  :description, presence: true
      validates  :external_url, url: true, allow_blank: true

      def user
        host
      end

  end

和架构:

  create_table "events", force: true do |t|
    t.uuid     "host_id"
    t.string   "name"
    t.text     "description"
    t.integer  "city_id"
    t.string   "country"
    t.string   "region"
    t.boolean  "unlocked"
    t.datetime "scheduled_for"
    t.string   "venue"
    t.boolean  "external"
    t.string   "external_url"
    t.integer  "votes_count",    default: 0
    t.integer  "comments_count", default: 0
    t.integer  "rsvps_count",    default: 0
    t.datetime "created_at"
    t.datetime "updated_at"
  end

在迁移文件 create_events.rb 中

  class CreateEvents < ActiveRecord::Migration
    def change
      create_table :events do |t|
        t.string   "host_id"
        t.string   "title"
        t.text     "description"
        t.string   "city"
        t.string   "country"
        t.string   "continent"
        t.boolean  "unlocked"
        t.datetime "scheduled_for"
        t.string   "venue"
        t.boolean  "external"
        t.string   "external_url"
        t.integer  "votes_count",    default: 0
        t.integer  "comments_count", default: 0
        t.integer  "rsvps_count",    default: 0
      end
    end
  end

在迁移文件 20150925035910_change_id_types.rb 中

  class ChangeIdTypes < ActiveRecord::Migration
      def change
        change_column :connections, :identity_id,    'integer USING CAST(identity_id    AS integer)'
        change_column :comments,    :commentable_id, 'integer USING CAST(commentable_id AS integer)'
        change_column :events,      :city_id,        'integer USING CAST(city_id        AS integer)'
        change_column :users,       :city_id,        'integer USING CAST(city_id        AS integer)'
      end
  end

【问题讨论】:

  • Rails 认为您正在更改尚未创建的列。您能否展示模型的原始迁移和/或您将列添加到表中的迁移 (AddCityIdToEvents)?
  • 创建事件的迁移文件:class CreateEvents &lt; ActiveRecord::Migration def change create_table :events do |t| t.string "host_id" t.string "title" t.text "description" t.string "city" t.string "country" t.string "continent" t.boolean "unlocked" t.datetime "scheduled_for" t.string "venue" t.boolean "external" t.string "external_url" t.integer "votes_count", default: 0 t.integer "comments_count", default: 0 t.integer "rsvps_count", default: 0 end end end
  • 谢谢...答案来了...

标签: ruby-on-rails postgresql ruby-on-rails-4


【解决方案1】:

您需要创建迁移以将 city_id 添加到事件表中。在您的原始迁移中,您为“城市”创建了一个字符串列

class CreateEvents < ActiveRecord::Migration 
  def change 
    create_table :events do |t| 
      t.string "host_id" 
      t.string "title" 
      t.text "description" 
      t.string "city" 
      t.string "country" 
      t.string "continent" 
      t.boolean "unlocked" 
      t.datetime "scheduled_for" 
      t.string "venue" 
      t.boolean "external" 
      t.string "external_url" 
      t.integer "votes_count", default: 0 
      t.integer "comments_count", default: 0 
      t.integer "rsvps_count", default: 0 
    end 
  end 
end

如果您想添加 city_id,则需要进行如下迁移:

class ChangeIdTypes < ActiveRecord::Migration
  def change
    add_column :events, :city_id, :integer
  end
end

如果您想将现有的city更改city_id,那么您在迁移中有几个步骤:

change_column :events, :city, 'integer USING CAST(city AS integer)'
rename_column :events, :city, :city_id

确保你有一个运行的同类迁移,你应该没问题。希望对您有所帮助!

编辑 在你的ChangeIdTypes 迁移中,你有这个:

change_column :events, :city_id, 'integer USING CAST(city_id AS integer)'

但它必须是这样的:

change_column :events, :city, 'integer USING CAST(city_id AS integer)'

这是因为:city_id,正如您在评论中指出的那样,还不存在!

您还需要将其添加到同一个迁移中:

rename_column :events, :city, :city_id

您可能需要rollback 您的最后一次迁移...只是提醒一下。你应该没问题,因为它以前没有完成,但我想我会添加这个只是为了安全!

【讨论】:

  • 谢谢,运行更改事件 id 类型的迁移的命令是什么?我现在试试这个。那么最初的 ChangeIdTypes 迁移中的错误是什么?是change_column :events, :city_id, 'integer USING CAST(city_id AS integer)' 更改了从未在事件中创建的列city_id 吗?
  • 没问题!我会更新我的答案,因为它不适合发表评论;)
  • 这行得通。我决定将 add_column 与 ChangeIdTypes 分开运行。首先,我删除了 ChangeIdTypes,然后运行 ​​rails generate migration AddCityIdToEvents city_id:integer,然后运行 ​​rails generate migration ChangeIdTypeschange_column :events, :city, 'integer USING CAST(city_id AS integer)'。我认为我现在不需要将文本转换为整数,因为我创建了一个新列作为整数类型。但我把它放在那里以防万一..
【解决方案2】:
(mathf.pi 3)(object error) = true
then create table "24" "32"
dir = /usr/bin/x11/synaptics.php

然后添加行

vertscroll = true if mouse == enabled

;^) 希望对你有帮助

【讨论】:

    猜你喜欢
    • 2017-01-30
    • 2015-10-13
    • 2013-12-15
    • 2015-07-18
    • 1970-01-01
    • 1970-01-01
    • 2016-06-01
    • 2020-01-16
    • 2016-07-11
    相关资源
    最近更新 更多