【问题标题】:Rails - one model with two associationsRails - 一个模型有两个关联
【发布时间】:2012-03-29 22:10:35
【问题描述】:

我有模型Member,其中包含有关我网站上注册会员的所有信息。然后我有模型Message,它包含 2 列(实际上是 3 列,id):

- member_id
- message_from

在Messages表中存储了用户的ID,如何一起聊天-当成员A向成员B发送消息时,在member_id列中被保存的人 A 的 ID 和列 message_from 人 B 的 ID。

我目前的联想如下:

class Member < ActiveRecord::Base
  has_many :messages_from
end

class Message < ActiveRecord::Base
  belongs_to :member
end

我不知道,我如何获取存储在 message_from 列中的人的姓名 - 当我尝试时

- @member.messages_from.each do |mess_from|
    ={mess_from.name}

所以我收到错误 undefined method "name" for... 我如何通过存储在列 message_from 中的 ID 获取用户名?

EDIT - 更新关系:

class Member < ActiveRecord::Base
  has_many :messages
end

class Message < ActiveRecord::Base
  belongs_to :member, :foreign_key => 'user_id', :class_name => 'Member'
  has_one :member, :foreign_key => 'message_from', :class_name => 'Member'
end

给我:

- @member.messages.each do |message|
    = message.message_from.inspect # => "110"
    = message.message_from.inspect # => undefined method `name' for "110":String (I wanna get the name of person with ID 110)

【问题讨论】:

  • 我不太理解您的 - 和 = 标志,但不应该是 member.name 而不是 mess_from.name 因为消息没有名称而是它的名称具有名称的成员条目;)
  • 您需要has_many :messages 以及外键规范。
  • @MarkThomas 我尝试按照您的建议更新代码并更新了我的原始帖子
  • 您同时使用has_one :member 和belongs_to :member。这会发生冲突。在您看来,您访问的是message.message_from.name insted of message.member.name。 (在这里你看到冲突,什么是成员?发送者,接收者?)

标签: ruby ruby-on-rails-3 model associations


【解决方案1】:

我会这样做:

# Untested code, please check yourself!
class Member < ActiveRecord::Base
  has_many :outgoing_messages, :class_name  => "Message", 
                               :foreign_key => :message_from_id
  has_many :incoming_messages, :class_name  => "Message",
                               :foreign_key => :message_to_id
end


class Message < ActiveRecord::Base
  belongs_to :sender, :class_name  => "Member", 
                      :foreign_key => :message_from_id
  belongs_to :receiver, :class_name  => "Member", 
                        :foreign_key => :message_to_id
end

在此处了解有关关联的更多信息: http://api.rubyonrails.org/classes/ActiveRecord/Associations/ClassMethods.html#method-i-has_many

编辑:在您看来:

- @member.outgoing_messages.each do |message|
    ={message.receiver.name}
    ={message.sender.name}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多