2009-03-06 5 views

Antwort

0

Sie können auch beliebige SQL in Ihren Migrationen ausführen.

Wir haben einige Hilfsmethoden, die Fremdschlüssel in unseren Tabellen hinzufügen:

def add_foreign_key(from_table, from_column, to_table) 
    constraint_name = "fk_#{from_table}_#{from_column}" 

    execute %{alter table #{from_table} 
      add constraint #{constraint_name} 
      foreign key (#{from_column}) 
      references #{to_table}(id) 
      } 
    end 

Sie jede SQL verwenden können Sie Ihre Datenbank unterstützt.

+2

Eine Situation, in der Sie 'execute' verwenden müssen, ist, wenn Rails einen Index hinzugefügt und entsprechend dem Tabellennamen benannt hat, dann haben Sie die Tabelle umbenannt. Zum Beispiel habe ich 'users_roles' erstellt und eine Migration durchgeführt, um einen Index hinzuzufügen, den Rails' index_users_roles_on_role_id' benannt hat. Dann erkannte ich, dass ich die Tabelle in 'roles_users' umbenennen musste. Später, als ich versuchte, den Index zu entfernen, suchte Rails nach einem namens 'index_roles_users_on_role_id'. Also musste ich DROP INDEX index_users_roles_on_role_id ON roles_users "' in meiner Migration ausführen. (Dies ist für MySQL.) –

3

Gemäß der API ist die einzige Möglichkeit, dies zu erreichen, die Verwendung von remove_index und add_index.

+5

Nicht mehr zutreffend. Sollte es gelöscht werden? – dgilperez

40

Rails eine Verknüpfung 3 liefern einen Index umbenennen:

rename_index :table_name, :old_name, :new_name 

http://guides.rubyonrails.org/migrations.html

By the way, ist es nicht mehr tun, als die alte entfernt und das Hinzufügen der neuen:

http://apidock.com/rails/v2.3.8/ActiveRecord/ConnectionAdapters/SchemaStatements/rename_index

+1

rename_index scheint in 2.3.8 wieder hinzugefügt worden zu sein, Ihr zweiter Link zeigt diese Version sogar an. – mmacaulay

+3

rename_index scheint in Rails 3.1.3 nichts zu tun. Die Migration scheint sauber zu laufen, aber das Überprüfen sowohl des schema.rb als auch des ausführenden 'SHOW INDEXES FROM table_name' in MySQL zeigt den Index unter Beibehaltung seines früheren Namens. –

+4

Wie in der folgenden Antwort erwähnt, müssen die Indexnamen als Strings angegeben werden oder der Aufruf rename_index erfolgt stumm – Willbill

52

rename_index sollten Strings und keine Symbole gegeben werden.

Hatte mir beim Versuch, eine Tabelle und ihre Indizes umzubenennen, eine Weile den Kopf verkratzt. Schienen 3.2.3 und MySQL.

+0

PS: Denken Sie daran, 'rename_index' ** vor ** Sie' rename_column' zu ändern, sonst wird SQLServer eine Ausnahme auslösen : 'Entweder ist der Parameter @objname mehrdeutig oder der beanspruchte @objtype (INDEX) ist falsch. – Magne

8

Ab Rails 5 (EDIT: auch in Rails 4) wird beim Umbenennen der Spalte der Index automatisch umbenannt.

+0

Das ist großartig! Es sollte in der angenommenen Antwort erwähnt werden. –

+0

Ja. Diese Frage wurde in '09 gestellt !! 7 Jahre später hat sich viel verändert. Es ist jetzt automatisch. – gregblass

Verwandte Themen