23

Tôi muốn ActiveRecord tra cứu bằng cột không phải id từ bảng. Hy vọng điều này là rõ ràng khi tôi cung cấp cho bạn mẫu mã của tôi.Đường ray: tra cứu khóa ngoài không id ActiveRecord

class CoachClass < ActiveRecord::Base 
    belongs_to :coach 
end 

class Coach < ActiveRecord::Base 
    has_many :coach_classes, :foreign_key => 'user_name' 
end 

Khi tôi làm một coach_obj.coach_classes, điều này một cách đúng đắn gây

SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = 2) 

(2 là của id đây HLV rằng đó là vấn đề của tôi.)

Tôi muốn nó để kích hoạt

SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = 'David') 

('David' là của huấn luyện viên đó user_name)

user_name là duy nhất và hiện diện trong cả hai bảng.

Tôi không muốn có số coach_id trong bảng coach_classes vì một số lý do.

+0

tư vấn không mong muốn: bạn có thể muốn cân nhắc thêm coach_id vào bảng, điều này sẽ giúp dễ dàng hơn nếu mối quan hệ này trở nên lồng nhau và thông thường hơn. –

+0

Cảm ơn Jed. Nhưng tôi không muốn coach_id ở đó vì một lý do nào đó. – Garfield

Trả lời

51

Tôi nghĩ rằng bạn cần phải xác định các tùy chọn khóa chính trên các hiệp hội cũng như:

class CoachClass < ActiveRecord::Base 
    belongs_to :coach, :foreign_key => 'user_name', :primary_key => 'user_name' 
end 

class Coach < ActiveRecord::Base 
    has_many :coach_classes, :foreign_key => 'user_name', :primary_key => 'user_name' 
end 

này quy định các phương thức trả về khóa chính của các đối tượng liên quan (mặc định cho id).

+0

John, bạn có chắc chắn phía bên kia của hiệp hội có hiệu lực ở đây không? Người ta có thể đơn giản có 'has_many', không có' thuộc_to' ở phía bên kia. –

+0

@neutrino Tôi đã chỉnh sửa câu trả lời của mình. –

+0

Cảm ơn John! Bây giờ nó rõ ràng hơn nhiều về cách nó nhìn lên. – Garfield

-4

Bạn cần phải sử dụng finder_sql:

class Coach < ActiveRecord::Base 
    has_many :coach_classes, :finder_sql => 'SELECT * FROM `coach_classes` WHERE (`coach_classes`.user_name = "#{user_name}")' 
end 
+0

Lưu ý - họ đã thực hiện việc này trong các phiên bản sau. Thực sự là một phao cứu sinh khi 'ma thuật' của họ không có chức năng bạn cần. – JosephK

9

Có một tùy chọn gọi là primary_key đó là mỗi mặc định thiết lập để :id. Bạn muốn sử dụng:

Cũng sử dụng các tùy chọn này trên liên kết belongs_to.

Đọc thêm trong số documentation.

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