2015-08-18 7 views
0

Мне нужно сделать столбец как внешний ключ. Я много исследовал его. Я понял, что мне нужно добавить ассоциации. Я совершенно понятен в параметрах belongs_to, has_one и has_many. После создания ассоциаций рельсы знают, что существует ассоциация внешних ключей. Если я удалю основную запись, тогда зависимая запись будет удалена приложением rails. я читал о миграции, и я наткнулся на http://edgeguides.rubyonrails.org/active_record_migrations.html где упоминается: $ Bin/рельсы генерировать миграции AddUserRefToProducts пользователей: ссылкипосле добавления ассоциаций и индекса мне нужно явно использовать ключевое слово foreign_key для создания внешнего ключа столбца в приложении ruby-on-rails

сгенерирует:

class AddUserRefToProducts < ActiveRecord::Migration 
    def change 
    add_reference :products, :user, index: true, foreign_key: true 
    end 
end 

Сейчас на сайте: http://guides.rubyonrails.org/active_record_migrations.html , где это упоминается: $ bin/rails генерировать миграцию AddUserRefToProducts пользователя: ссылки

будет генерировать:

class AddUserRefToProducts < ActiveRecord::Migration 
    def change 
    add_reference :products, :user, index: true 
    end 
end 

Я понимаю создание индекса. Нужно ли иметь foreign_key: true явно или нет? какая разница?

ответ

0

На самом деле вам не нужен параметр, если вы определили ассоциацию на модели. Вы миграция может выглядеть следующим образом:

class AddUserRefToProducts < ActiveRecord::Migration 
    def change 
    add_column :products, :user_id, :integer 
    end 
end 

Если модель продукта имеет связи, он должен работать

class Product < ActiveRecord::Base 
    belongs_to :user 
end 
1

Если указать внешний ключ в вашей миграции, Rails добавит ограничение внешнего ключа в уровень базы данных. Если вы оставите это, никакое ограничение не будет добавлено, и оно будет вести себя как все предыдущие версии Rails, например. вы можете удалять записи с риском оставления потерянных записей.

Вы можете сделать что-то вроде

class AddUserRefToProducts < ActiveRecord::Migration 
    def change 
    add_reference :products, :user, index: true 
    add_foreign_key :products, :user 
    end 
end 

Similar solution here

1

Прежде всего, по моим знаниям http://edgeguides.rubyonrails.org/active_record_migrations.html еще должен быть освобожден. поэтому изменение foreign_key: true в вашей миграции еще не применяется, поэтому оно не изменит ситуацию.

См. Это http://edgeguides.rubyonrails.org/index.html.

Для стабильных версий используйте http://guides.rubyonrails.org/

Сейчас в http://guides.rubyonrails.org/active_record_migrations.html нет никакого выбора, как foreign_key: true.

Даже если вы передаете его, он не будет делать разницы, потому что в соответствии с методом add_reference
http://apidock.com/rails/v4.0.2/ActiveRecord/ConnectionAdapters/SchemaStatements/add_reference

Он не ожидает foreign_key быть в качестве опции.

И, наконец add_reference в основном вызывая http://apidock.com/rails/v4.0.2/ActiveRecord/ConnectionAdapters/SchemaStatements/add_columnadd_column метод в нем, который также не ожидает foreign_key быть принят в качестве параметра, так что это вовсе не обязательно.

Надеюсь, это имеет смысл