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