2016-06-16 15 views
1

Ich verwende Rails 4.2.3. Wie erstelle ich eine Migration, die eine Spalte zu einer Tabelle hinzufügt, die denselben Typ wie die Tabelle hat? Wie füge ich einen Fremdschlüssel hinzu (es ist in Ordnung, wenn die Spalte NULL ist)? Ich habe versucht, dieseIn Rails, wie erstelle ich eine Migration, die eine Spalte/einen Fremdschlüssel zu einer Tabelle hinzufügt, die vom gleichen Typ wie diese Tabelle ist?

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

aber ich habe diesen Fehler bei der Ausführung der Migration

== 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/[email protected]/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:155:in `async_exec' 
/Users/davea/.rvm/gems/[email protected]/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/postgresql/database_statements.rb:155:in `block in execute' 
/Users/davea/.rvm/gems/[email protected]/gems/activerecord-4.2.5.1/lib/active_record/connection_adapters/abstract_adapter.rb:472:in `block in log' 

Antwort

1

Ich glaube, Sie brauchen, es zu tun "von Hand":

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 

Dann in der MyObject Klasse sagen dieses:

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

Ich habe etwas ähnliches gemacht. Ich würde eine Referenz in der Artikeltabelle hinzufügen, die auf Benutzer verweist. Und was das ist, erstellen Sie einen Index namens user_id in der Artikel-Tabelle.

1: Der Befehl, um die Migration zu erzeugen, wäre:

rails generate migration add_user_id_to_articles user:references 

2: Das Ergebnis der Migration wäre:

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

3: Lauf rake db:migrate im Terminal

4: Das Ergebnis dieser Migration in der Datei scheme.rb wäre: , wo Sie t.integer "user_id" hinzugefügt haben

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: den Verein zu tun, möchte ich hinzufügen, Modell

belongs_to :user 

Und dann, im user.rb Modell article.rb

has_many :articles