has_one有两个外键?

时间:2010-08-03 04:19:53

标签: ruby-on-rails foreign-keys belongs-to has-one

我有两个类Message和User。消息具有sender_id和recipient_id两个用户的外键。如何构建关系,我将能够为发件人和收件人获取用户,例如@ message.sender.name和@ 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,它说“未定义的方法`名称'”

1 个答案:

答案 0 :(得分:2)

您可以使用:class_name属性设置用于外键的类:

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_idrecipient_id作为外键,但在您的代码中,您有:foreign_key => 'sender':foreign_key => 'recipient'。您是否尝试将其更改为:foreign_key => 'sender_id':foreign_key => 'recipient_id'?所以:

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