Dodaj kolumnę dla referencji (Rails)

Mam następującą migrację Rails, która działa idealnie (niepotrzebne kawałki usunięte):

create_table :comments do |t|
  t.text :body
  t.references :post
end

Teraz chciałbym dodać kolumnę author do mojej tabeli comments (która jest identyfikatorem użytkownika), ale nie mam pojęcia, jak to zrobić (kusi mnie, aby napisać składnię specyficzną dla MySql za pomocą execute).

Szukałem add_column tutaj, które nie wspominają references. Rzeczywiście znalazłem TableDefinition#references ale nie mam pojęcia jak tego użyć z add_column oświadczenie.

Czy to możliwe? Czy to prawda, że w przypadku MySql funkcjonalność "Reference" nie ustanawia relacji między tabelami?
Author: Johan, 2009-01-30

6 answers

Chociaż jest już za późno, aby uzyskać jakiekolwiek punkty z tego, pomyślałem, że opublikuję najlepszy sposób dla potomności:)

Użyj change_table zamiast create_table, aby dodać kolumny do tabeli, która już istnieje, z całą dobrocią TableDefinition:

self.up do
  change_table :comments do |t|
    t.references :author
  end
end

Może to wydawać się banalne, ale inne klejnoty, takie jak Devise, wykorzystują własne niestandardowe definicje tabel i w ten sposób nadal możesz ich używać.

 104
Author: Jaime Bellmyer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-10-15 18:21:39
add_reference :table_name, :reference, index: true
 70
Author: Rajeev Kannav Sharma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-07 19:42:38

Finally got it

add_column :locations, :state_id , :integer, :references => "states"
 34
Author: Swapnil Chincholkar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-10-31 20:06:31

Najpierw zrób:

script/generate migration AddAuthorIdToComments

Otwórz wygenerowany plik i dodaj tę linię:

add_column :comments, :author_id, :integer

Następnie w plikach modelu:

class User < ActiveRecord::Base
  has_many :comments, :foreign_key => "author_id"
end

class Comment
  belongs_to :author, :class_name => User
end
 20
Author: Milan Novota,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-12 22:01:38

Dawno na to nie patrzyłem, ale ostatnio sprawdzałem migracje nie obsługują tworzenia kluczy obcych. Na szczęście jednak jest do niego wtyczka . Używałem tego i działa dobrze.

 2
Author: Craig Stuntz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2009-01-29 22:43:39

Możesz dodać kolumnę przez add_column(:table, :column_name, :type, :options) w nowej migracji.

 0
Author: KARASZI István,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-06-14 08:15:25