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
Yes, t.belongs_to :category
acts as an alias for t.integer category_id
, in that it causes an appropriately typed category_id
field to be created.
In MySQL, the migration gets me a table like this (note the category_id
field on the second row):
mysql> describe products;
+-------------+---------------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------+---------------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| category_id | int(11) | YES | | NULL | |
| name | varchar(255) | YES | | NULL | |
| price | decimal(10,0) | YES | | NULL | |
| description | text | YES | | NULL | |
| created_at | datetime | YES | | NULL | |
| updated_at | datetime | YES | | NULL | |
+-------------+---------------+------+-----+---------+----------------+
Yes, it's an alias; It can also be written t.references category
.
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.
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
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
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
add_belongs_to(table_name, *agrs)
is what you are looking for. You can read about here
$ 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