【问题标题】:has_one with two foreign keys?has_one 有两个外键?
【发布时间】:2010-08-03 04:19:52
【问题描述】:

我有两个类 Message 和 User。消息具有 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 时,它​​说“未定义的方法‘名称’”

【问题讨论】:

  • 我认为您的解决方案是正确的。您确定上面的示例消息设置了recipient_id 字段吗?因为当它被设置并且对应的User 不存在时你应该得到一个RecordNotFound 异常。

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


【解决方案1】:

您可以使用: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 =&gt; 'sender':foreign_key =&gt; 'recipient'。您是否尝试将它们更改为:foreign_key =&gt; 'sender_id':foreign_key =&gt; '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

【讨论】:

  • 没用是什么意思?你收到错误信息了吗?错误的数据?这是一条双向街道:p
  • 我用代码示例更新了主题,因为无法在评论中发布它:)
  • 是的,我也注意到了这个错误并修复了它,但也没有帮助:(
  • 如果你能找到更多关于你得到什么的信息会有所帮助......你知道如何将irb 与rails 模型一起使用吗? guides.rubyonrails.org/command_line.html#console
  • 哈,有帮助,谢谢。这是愚蠢的错误,只是使用了错误的课程。你的方法有效
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2021-12-01
  • 1970-01-01
  • 2015-10-17
  • 1970-01-01
  • 1970-01-01
  • 2011-12-04
  • 1970-01-01
相关资源
最近更新 更多