Tôi có mối quan hệ giữa 2 kiểu trong ứng dụng đường ray của mình. Tôi đã tránh xa tiêu chuẩn về cách thực hiện mối quan hệ khi tôi sử dụng một trường khác làm khóa chính và quy ước đặt tên khác nhau. Làm như vậy dẫn đến mối quan hệ dường như không được thiết lập. Tôi muốn hiểu tại sao.Rails thuộc về has_many với khóa ngoài tùy chỉnh
Đây là phiên bản cắt giảm của các mô hình của tôi:
class Player < ActiveRecord::Base
set_primary_key "alias"
attr_accessible :alias, :avatar
has_many :player_sessions, :foreign_key => "player_alias", :class_name => "PlayerSession"
end
class PlayerSession < ActiveRecord::Base
attr_accessible :player_alias, :total_score
belongs_to :player, :foreign_key => "player_alias", :class_name => "Player"
end
Mô hình Player
có trường alias
đó là tên người dùng trong ứng dụng của tôi. Tôi muốn tên người dùng hoạt động như khóa chính vì nó là duy nhất và sẽ dễ dàng di chuyển dữ liệu hơn và duy trì mối quan hệ.
Ban đầu tôi chỉ có mô hình PlayerSession với dữ liệu đã được điền, nhưng khi ứng dụng của tôi phát triển, tôi đã thêm mô hình Trình phát và chỉ cần chèn một hàng với cùng một alias
.
Trong show
quan điểm của Player
Tôi có đoạn code sau:
Player Sessions:
<% @player.player_sessions do |player_session| %>
<ul>
<li><h4>Highest Score:</h4> <%= player_session.total_score %> </li>
</ul>
Khi tôi cố gắng truy cập vào các trang nó đơn giản không hiển thị các thông tin.
Thông tin khác tôi có thể thêm là tôi chưa thêm bất kỳ mối quan hệ nào trong cơ sở dữ liệu.
Tôi vẫn còn mới đến đường ray và vẫn chơi đùa với nó. Bất kỳ ý kiến nào liên quan đến tiêu chuẩn viết mã (ngoài việc trả lời câu hỏi) đều được hoan nghênh.
Cập nhật tôi đã thực hiện đề nghị Babur Usenakunov bằng cách thêm các primary_key
tùy chọn trong các mô hình:
class Player < ActiveRecord::Base
set_primary_key "alias"
attr_accessible :alias, :avatar
has_many :player_sessions, :primary_key => "alias", :foreign_key => "player_alias", :class_name => "PlayerSession"
end
class PlayerSession < ActiveRecord::Base
attr_accessible :player_alias, :total_score
belongs_to :player, :primary_key => "alias", :foreign_key => "player_alias", :class_name => "Player"
end
Ngoài ra để kiểm tra dữ liệu được hợp lệ tôi mua lại danh sách PlayerSession thủ công:
Mã được triển khai trong bộ điều khiển:
@player_sessions = PlayerSession.where("player_alias = ?", params[:id])
.210
Mã thực hiện theo quan điểm (mà kết quả đầu ra dữ liệu):
<% @player_sessions.each do |player_session| %>
<ul>
<li><h4>Highest Score:</h4> <%= player_session.total_score %> </li>
</ul>
<% end %>
Tôi không chắc chắn nhưng có thể bạn cũng nên chuyển khóa chính trong các tùy chọn. Ví dụ. 'has_many: player_sessions,: primary_key => 'alias',: foreign_key => 'player_alias': class_name => 'PlayerSession'' và' thuộc_to: player,: primary_key =>' alias ',: foreign_key => "player_alias", : class_name => "Player" ' –
Đã thử nó theo cách đó nhưng vẫn không hoạt động – Drahcir
@ Drahcir, tôi có khuynh hướng nghĩ rằng gợi ý của Babur Usenakunov nên đã hoạt động. '@ Player.player_sessions' trở lại sau khi bạn thử đề xuất của họ là gì? – Sun