问题描述
我有两个类 Message 和 User.消息具有 user 的 sender_id 和 recipient_id 两个外键.如何建立关系,我将能够为发件人和收件人获取用户,例如 @message.sender.name 和 @message.recipient.name
I have two classes Message and User. Message has sender_id and recipient_id both foreign keys for User. How to build relationship where I'll be able to get user for both sender and recipient, like @message.sender.name and @message.recipient.name
我尝试过这样做:
class Message < ActiveRecord::Base
belongs_to :sender, :class_name => 'User', :foreign_key => 'sender'
belongs_to :recipient, :class_name => 'User', :foreign_key => 'recipient'
end
class User < ActiveRecord::Base
has_many :recivied_messages, :class_name => 'Message', :foreign_key => 'recipient'
has_many :send_messages, :class_name => 'Message', :foreign_key => 'sender'
end
但它没有帮助,例如,当我尝试访问 @message.recipient.name 时,它说未定义的方法‘名称’"
But it didn't help, when I'm trying to access to, for instance, @message.recipient.name it says that "undefined method `name'"
推荐答案
您可以使用 :class_name
属性来设置哪个类用于外键:
You can use the :class_name
property to set which class gets used for a foreign key:
class Message < ActiveRecord::Base
has_one :sender, :class_name => User
has_one :recipient, :class_name => User
end
class User < ActiveRecord::Base
belongs_to :sent_messages, :class_name => Message
belongs_to :received_messages, :class_name => Message
end
另外,你说你使用 sender_id
和 recipient_id
作为外键,但在你的代码中你有 :foreign_key =>'sender'
和 :foreign_key =>'收件人'
.您是否尝试将它们更改为 :foreign_key =>'sender_id'
和 :foreign_key =>'recipient_id'
?所以:
Also, you say you are using sender_id
and recipient_id
for the foreign keys, but in your code you have :foreign_key => 'sender'
and :foreign_key => 'recipient'
. Have you tried changing them to :foreign_key => 'sender_id'
and :foreign_key => 'recipient_id'
? So:
class Message < ActiveRecord::Base
has_one :sender, :class_name => User, :foreign_key => 'sender_id'
has_one :recipient, :class_name => User, :foreign_key => 'recipient_id'
end
class User < ActiveRecord::Base
belongs_to :sent_messages, :class_name => Message, # ...etc
belongs_to :received_messages, :class_name => Message, # ...etc
end
这篇关于has_one 有两个外键?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!