Shruts_me
Shruts_me

Reputation: 893

after adding associations and index do I need to explicitly use foreign_key keyword to make a column foreign key in ruby-on-rails app

I need to need to make a column as foreign key. I did lot of research on it. I understood that I need to add associations. I am clear on belongs_to , has_one and has_many options. After creating associations rails know that there is a foreign key association.If I remove the main record then dependent record will be deleted by rails app. I was reading on migrations and I came across http://edgeguides.rubyonrails.org/active_record_migrations.html where it is mentioned: $ bin/rails generate migration AddUserRefToProducts user:references

will generate:

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

Now on website: http://guides.rubyonrails.org/active_record_migrations.html where it is mentioned: $ bin/rails generate migration AddUserRefToProducts user:references

will generate:

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

I understand the creation of index. Do I need to have foreign_key: true explicitly or not? what difference will it make?

Upvotes: 0

Views: 124

Answers (3)

Athar
Athar

Reputation: 3268

First of all according to my knowledge http://edgeguides.rubyonrails.org/active_record_migrations.html is yet to be released. so the change foreign_key: true in your migration is not applicable yet so it wont make difference.

See this http://edgeguides.rubyonrails.org/index.html.

For stable versions, use http://guides.rubyonrails.org/

Now in http://guides.rubyonrails.org/active_record_migrations.html there is no option like foreign_key: true.

Even if you pass it, it wont make difference because according to the method add_reference
http://apidock.com/rails/v4.0.2/ActiveRecord/ConnectionAdapters/SchemaStatements/add_reference

It is not expecting foreign_key to be as option.

And lastly add_reference is basically calling http://apidock.com/rails/v4.0.2/ActiveRecord/ConnectionAdapters/SchemaStatements/add_column add_column method in it, which is also not expecting foreign_key to be passed as parameter, so it is not at all necessary.

Hope it makes sense

Upvotes: 1

bryanmikaelian
bryanmikaelian

Reputation: 86

If you specify the foreign key in your migration, Rails will add a foreign key constraint at the database level. If you leave it out, no constraint will be added and it will behave like all previous versions of Rails e.g. you can delete records with the risk of orphaned records being left behind.

You can do something like

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

Similar solution here

Upvotes: 1

tegon
tegon

Reputation: 538

Actually, you don't need the option if you defined the association on the model. You migration could look like this:

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

If the Product model has the association, it should work

class Product < ActiveRecord::Base
  belongs_to :user
end

Upvotes: 0

Related Questions