2012-05-19 26 views
25

Tôi có một mô hình Rails mà tôi sử dụng hai quan hệ has_one: requesterfriend. Khi ở trong giao diện điều khiển tôi sử dụng:Rails has_one với tên lớp và khóa ngoài

f = FriendRequest.all 
f[0].requester 

tôi nhận được ActiveRecord::StatementInvalid: SQLite3::SQLException: no such column: users.requester_id: SELECT "users".* FROM "users" WHERE "users"."requester_id" = 4 LIMIT 1 .

Tôi không thực sự biết cách chỉ định mối quan hệ `has_one 'với tên lớp và khóa chỉ định bản ghi. Đây là mô hình của tôi:

class FriendRequest < ActiveRecord::Base 
    has_one :requester, :class_name => "User", :foreign_key => "requester_id" 
    has_one :friend, :class_name => "User", :foreign_key => "friend_id" 
end 

Tôi làm cách nào? Trong mối quan hệ belongs_to tôi sử dụng tương tự, rõ ràng là thay thế has_one bằng belongs_to. Cảm ơn!

Trả lời

27
has_one :requester, :class_name => "User", :foreign_key => "requester_id" 

Dòng này (từ mã mà bạn đăng) chỉ ra rằng requester là một User, và bảng users nên chứa một cột requester_id đó là chìa khóa nước ngoài đối với friend_requests hồ sơ. Thông báo lỗi đường ray cho biết cột requester_id không tồn tại (bạn phải tạo nó qua migration).

Trong trường hợp này, sử dụng

rails generate migration AddRequesterIdToUsers requester_id:integer 

Nó sẽ tạo ra sự di cư:

class AddRequesterIdToUsers < ActiveRecord::Migration 
    def change 
    add_column :users, :requester_id, :integer 
    end 
end 

Và chạy chúng di chuyển với rake db:migrate.

Nhìn vào số Rails Relation Guide để biết thêm thông tin về sự khác biệt giữa has_onebelongs_to và cách sử dụng chúng.

Các vấn đề liên quan