после добавления ассоциаций и индекса мне нужно явно использовать ключевое слово foreign_key, чтобы сделать внешний ключ столбца в приложении ruby-on-rails

Мне нужно сделать столбец как внешний ключ. Я провел много исследований по этому поводу. Я понял, что нужно добавить ассоциации. Я разбираюсь в опциях own_to , has_one и has_many . После создания ассоциаций рельсы знают, что существует ассоциация внешнего ключа. Если я удалю основную запись, то зависимая запись будет удалена приложением rails. Я читал о миграции и наткнулся на http://edgeguides.rubyonrails.org/active_record_migrations.html где упоминается: $ bin/rails generate migration AddUserRefToProducts user:references

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

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 user:references

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

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

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


person Shruts_me    schedule 18.08.2015    source источник


Ответы (3)


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

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

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

Подобное решение здесь

person bryanmikaelian    schedule 18.08.2015

Прежде всего, насколько мне известно, 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_column add_column в нем, который также не ожидает передачи foreign_key в качестве параметра, так что он совсем не нужен.

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

person Athar    schedule 18.08.2015

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

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

Если модель продукта имеет ассоциацию, она должна работать

class Product < ActiveRecord::Base
  belongs_to :user
end
person tegon    schedule 18.08.2015