t.belongs_to in migration
I was using Ryan Bates's source code for railscasts #141 in order to create a simple shopping cart. In one of the migrations, he lists
class CreateProducts < ActiveRecord::Migration
def self.up
create_table :products do |t|
t.belongs_to :category
t.string :name
t.decimal :price
t.text :description
t.timestamps
end
end
def self.down
drop_table :products
end
end
Here is the Product model:
class Product < ActiveRecord::Base
belongs_to :category
end
What is the t.belongs_to :category
line? Is that an alias for t.integer category_id
?
Solution 1:
The t.belongs_to :category
is just a special helper method of rails passing in the association.
If you look in the source code belongs_to
is actually an alias of references
Solution 2:
$ rails g migration AddUserRefToProducts user:references
this generates:
class AddUserRefToProducts < ActiveRecord::Migration
def change
add_reference :products, :user, index: true
end
end
http://guides.rubyonrails.org/active_record_migrations.html#creating-a-standalone-migration
Solution 3:
Yes, it's an alias; It can also be written t.references category
.
Solution 4:
First: the migration
rails generate migration add_user_to_products user:belongs_to
(in this situation) is equivalent to
rails generate migration add_user_to_products user:references
and both create
class AddUserToProducts < ActiveRecord::Migration
def change
add_reference :products, :user, index: true
end
end
You could 'read' add_reference :products, :user, index: true
as "products belong to user(s)"
In the schema, the migration will create a field in the items
table called "user_id"
. This is why the class is called AddUserToProducts
. The migration adds the user_id
field to products.
Second: the model
He then should have updated the product model as that migration would have only changed the schema. He would have had to update the user model too with something like
class User < ActiveRecord::Base
has_many :products
end
In general
rails g migration add_[model linking to]_to_[table containing link] [model linking to]:belongs_to
Note: g
is short for generate
class User < ActiveRecord::Base
has_many :[table containing link]
end
Solution 5:
add_belongs_to(table_name, *agrs)
is what you are looking for. You can read about here