2013-03-13 36 views
34

Tôi tự hỏi làm thế nào tôi có thể thêm liên kết vào các mô hình của mình. Giả sử, tôi tạo ra hai mô hìnhthêm liên kết vào các mô hình hiện có

rails generate model User 
rails generate model Car 

Bây giờ tôi muốn thêm một hiệp hội để các mô hình mua theo hình thức

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

Câu hỏi đặt ra là: làm thế nào để áp dụng những thay đổi bằng di cư để có được cars_users bảng trong cơ sở dữ liệu? Tôi đang lập kế hoạch để sử dụng bảng đó trong mã của tôi.

+5

bạn không có nhu cầu về một 'bảng cars_users' vì bạn không có mối quan hệ nhiều-nhiều. – Zippie

Trả lời

55

belongs_to hiệp hội mong đợi một cột association_id trong đó là bảng tương ứng. Vì ô tô thuộc về người dùng nên bảng ô tô phải có cột user_id. Điều này có thể được thực hiện theo 2 cách.

đầu tiên, bạn có thể tạo ra các cột khi bạn tạo mô hình

rails g model car user_id:references 

hoặc chỉ cần thêm user_id sau khi bạn tạo ra các mô hình như câu trả lời Richard Brown. Hãy cẩn thận nếu bạn sử dụng integer thay vì references, bạn phải tự mình tạo chỉ mục.

rails g migration add_user_id_to_cars user_id:integer 

sau đó trong cuộc di cư tạo ra, thêm

add_index :cars, :user_id 

UPDATE:

Như Joseph đã đề cập trong các ý kiến, sự cần thiết phải thêm chỉ số bằng tay đã được đề cập đến trong phiên bản hiện tại của Rails. Tôi nghĩ rằng nó đã được giới thiệu trong Rails 4. Bạn có thể đọc thêm về nó trong official Rails guide for migrations. Các ý chính của nó đang chạy máy phát điện sau

bin/rails g migration add_user_to_cars user:references 

sẽ tạo ra một sự chuyển đổi với một dòng tương tự như

add_reference :cars, :user, index: true 

này sẽ bổ sung thêm một cột user_id vào bảng chiếc xe và nó cũng sẽ đánh dấu cột để được lập chỉ mục.

+0

chỉ tò mò: nếu giữa các mô hình có liên kết has_and_belongs_to_many. Ai sẽ chịu trách nhiệm tạo bảng cars_users? Tôi, Ruby on Rails hay ai đó khác? – Andrew

+3

bạn. Các bảng tham gia không cần một lớp nhưng vẫn cần bảng và bạn cần phải tạo một di chuyển cho điều đó :) – jvnill

+2

Thay vì làm điều này theo hai bước, bạn có thể thêm các tham chiếu sau khi tạo mô hình như sau: 'rails g migration addUserReferencesToCars user : references'. Việc này sẽ quan tâm đến việc thêm 'user_id' vào' cars' và biến nó thành một chỉ mục trong một lần chụp. – Joseph

7

Tạo một chuyển đổi sang tạo sự liên kết:

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

Sau @ giải thích jvnill trong ray 4 (và có thể ở đường ray 3.2 quá), bạn có thể làm điều đó như thế này quá (tránh những phần id và ghi nhớ các convetions chính xác):

rails g migration AddUserToCar user:references 

Mà sẽ tạo sự di cư sau, chăm sóc của cả hai thêm cột và chỉ số với tất cả các công ước chính xác:

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

cuối cùng như mọi khi chạy di cư:

01.
rake db:migrate 

Xem schema.rb để xem chỉ mục mới và cột user_id.

0

Migration file:

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 
Các vấn đề liên quan