【问题标题】:In Rails, how do I create a migration that will add a column/foreign key to a table that is of the same type as that table?在 Rails 中,如何创建将列/外键添加到与该表类型相同的表的迁移?
【发布时间】:2016-06-16 20:22:29
【问题描述】:

我使用的是 Rails 4.2.3。如何创建将列添加到与表类型相同的表的迁移?此外,如何添加外键(如果列为 NULL 也可以)?我试过这个

class AddLinkedMyObjectToMyObjects < ActiveRecord::Migration
  def change
    add_reference :my_objects, :linked_my_object, type: :my_object, index: true, foreign_key: true
  end
end

但我在运行迁移时遇到此错误

== 20160616201701 AddLinkedMyObjectToMyObjects: migrating =============================
-- add_reference(:my_objects, :linked_my_object, {:type=>:my_object, :index=>true, :foreign_key=>true})
rake aborted!
StandardError: An error has occurred, this and all later migrations canceled:

PG::UndefinedObject: ERROR:  type "my_object" does not exist
LINE 1: ALTER TABLE "MyObjects" ADD "linked_my_object_id" my_object
                                                 ^
: ALTER TABLE "MyObjects" ADD "linked_my_object_id" my_object
/Users/davea/.rvm/gems/ruby-2.3.0@global/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:155:in `async_exec'
/Users/davea/.rvm/gems/ruby-2.3.0@global/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:155:in `block in execute'
/Users/davea/.rvm/gems/ruby-2.3.0@global/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/abstract_adapter.rb:472:in `block in log'

【问题讨论】:

    标签: postgresql ruby-on-rails-4 foreign-keys migration


    【解决方案1】:

    我认为您需要“手动”完成:

    add_column :my_objects, :linked_my_object_id, :integer
    add_index :my_objects, :linked_my_object_id
    add_foreign_key :my_objects, :my_objects, column: :linked_my_object_id
    

    然后在MyObject 类中这样说:

    belongs_to :linked_my_object, class_name: MyObject
    has_many :my_objects, foreign_key: :linked_my_object_id
    

    【讨论】:

      【解决方案2】:

      我做了类似的事情。 我会在文章表中添加引用用户的引用。这样做是在文章表中创建一个名为 user_id 的索引。

      1:生成迁移的命令是:

      rails generate migration add_user_id_to_articles user:references
      

      2:结果迁移将是:

      class AddUserIdToArticles < ActiveRecord::Migration
        def change
          add_reference :articles, :user, index: true, foreign_key: true
        end
      end
      

      3:在终端运行rake db:migrate

      4:在 scheme.rb 文件中迁移的结果是: 在哪里可以看到添加的 t.integer "user_id"

      create_table "articles", force: :cascade do |t|
          t.string   "title"
          t.text     "body"
          t.integer  "visits_count"
          t.datetime "created_at",   null: false
          t.datetime "updated_at",   null: false
          t.integer  "user_id"
      

      5:要进行关联,我会添加到 article.rb 模型中

      belongs_to :user
      

      然后,在 user.rb 模型中

      has_many :articles
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2015-03-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-11
        • 1970-01-01
        • 2020-08-24
        • 2020-08-30
        相关资源
        最近更新 更多