2013-03-13 62 views
34

我想知道如何将关联添加到我的模型。假设,我产生两种型号添加关联到现有模型

rails generate model User 
rails generate model Car 

现在我想,这样的车型获得表单中添加一个协会

class User < ActiveRecord::Base 
    has_many :cars 
end 
class Car < ActiveRecord::Base 
    belongs_to :user 
end 

的问题是:如何通过迁移,以获得cars_users将此修改数据库中的表?我打算在我的代码中使用该表。

+5

你不需要一个'cars_users'表,因为你没有多到多的关系。 – Zippie 2013-03-13 12:19:36

回答

55

belongs_to协会期待一个association_id列在它的相应的表。由于汽车属于用户,汽车表应该有一个user_id列。这可以通过2种方式完成。

首先,您可以在创建模型

rails g model car user_id:references 

或只是你创建了理查德·布朗的回答型号后添加USER_ID产生列。请注意,如果您使用integer而不是references,则必须自己创建索引。

rails g migration add_user_id_to_cars user_id:integer 

然后在生成的迁移,添加

add_index :cars, :user_id 

UPDATE:

约瑟夫在评论中提到,添加索引需要手动已经在当前版本中解决的Rails。我认为它是在Rails 4中引入的。您可以在official Rails guide for migrations中阅读更多内容。它的要点是运行以下发电机

bin/rails g migration add_user_to_cars user:references 

将创建类似

add_reference :cars, :user, index: true 

线迁移这会user_id列添加到汽车的表,它也标志着该列被索引。

+0

只是好奇心:如果模型之间有has_and_belongs_to_many关联。那么谁将负责创建cars_users表?我,Ruby on Rails还是其他人? – Andrew 2013-03-13 17:05:20

+3

你。 habtm连接表不需要一个类,但仍然需要该表,并且需要为此创建一个迁移:) – jvnill 2013-03-13 19:04:09

+2

而不是在两个步骤中完成此操作,可以在创建模型后添加引用,如下所示:'rails g migration addUserReferencesToCars user :references'。这需要将'user_id'添加到'cars'并使其成为一次性索引。 – Joseph 2015-02-19 16:44:18

7

生成迁移来建立关联:

rails g migration AddUserIdToCars user_id:integer 
rake db:migrate 
15

继@ jvnill的解释中轨道4(也许在导轨3.2也行),你可以像这样做太(避免ID部和记忆的准确convetions):

rails g migration AddUserToCar user:references 

,这将创造以下迁移,同时服用的保健加上列和索引的所有正确的约定:

class AddUserToCar < ActiveRecord::Migration 
    def change 
    add_reference :cars, :user, index: true 
    end 
end 

在结束一如既往运行迁移:

rake db:migrate 

查看您的schema.rb以查看新索引和user_id列。

0

迁移文件:

class Createuser < ActiveRecord::Migration[5.0] 
    def change 
    create_table :users do |t| 
     t.string :name 
    end 

    create_table :cars do |t| 
     t.belongs_to :user, index: true 
     t.varchar(255) :model 
     t.varchar(255) :color 
    end 
    end 
end