Рельсы - одна модель с двумя ассоциациями - PullRequest
1 голос
/ 30 марта 2012

У меня есть модель Member, которая содержит всю информацию о зарегистрированном участнике на моем сайте.Тогда у меня есть модель Message, которая содержит 2 столбца (на самом деле 3 с id):

- member_id
- message_from

В таблице Messages хранятся идентификаторы пользователя, как общаются вместе - когда участник A отправить сообщение участнику B , поэтому в столбце member_id сохраняется идентификатор человека A и в столбце message_from идентификатор лица B .

Мои текущие ассоциации выглядят так:

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?

РЕДАКТИРОВАТЬ - обновить отношения:

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)

1 Ответ

4 голосов
/ 30 марта 2012

Я бы сделал что-то вроде этого:

# 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}
...