2013-03-13 71 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 
相關問題