2011-07-09 20 views
8

tôi có các mô hình thiết lập của tôi như vậy:Rails belongs_to không thiết lập id chính nước ngoài với tên lớp tùy chỉnh

class User < ActiveRecord::Base 
    has_many :posts, :foreign_key => 'author_id' 
end 

class Post < ActiveRecord::Base 
    belongs_to :author, :class_name => 'User' 
end 

Giả sử:

p = Post.first # just any post instance 
a = User.first # any user instance 

Bây giờ đoạn mã này là hành động rất lạ

p.author = a 

Sau khi đặt tác giả, thuộc tính author_id của bài đăng phải được đặt thành id của người dùng. Nhưng điều này không xảy ra.

Tôi đã thử sử dụng các kiểu có belongs_to không có tham số class_name và mọi thứ hoạt động như mong đợi.

Bây giờ, một điều nữa khiến nó trở nên kỳ quặc hơn là khi tôi thay đổi liên kết thành belongs_to :author, :class_name => 'User', :foreign_key => 'author_id', nó hoạt động đáng ngạc nhiên.

Đây có phải là lỗi trong Rails 3.0.9 không? Không nên tham số khóa ngoài là không cần thiết vì như các tài liệu nói, giá trị mặc định của nó là tên của hiệp hội nối với _id.

Cũng lưu ý rằng ngay cả khi không có :foreign_key => 'author_id', mọi thứ khác về liên kết đều hoạt động như mong đợi. (Giống như tìm nạp mô hình liên quan) Điều duy nhất không hoạt động là phương thức setter không thiết lập khóa ngoài.

Tôi biết tôi chỉ có thể làm p.author_id = a.id hoặc chỉ cần thêm :foreign_key params cho tất cả các hiệp hội của tôi với class_name, nhưng tôi thích cú pháp tao nhã hơn p.author = a

Trả lời

6

Sau khi đọc qua rất nhiều mã Rails và truy tìm ở đây là những gì tôi tìm thấy:

Lỗi này tồn tại do đá quý composite_primary_keys làm hỏng đường ray mặc định reflection.rb.

Tôi sẽ phải kiểm tra cách chúng triển khai các phương pháp primary_key_namederive_primary_key_name.

Đã khá nhiều thời gian lãng phí cho lỗi ngớ ngẩn này, nhưng ít nhất tôi đã học được rất nhiều về nội bộ của ActiveRecord.

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