has_one с двумя внешними ключами? - PullRequest
0 голосов
/ 03 августа 2010

У меня есть два класса Message и User.Сообщение имеет sender_id и receient_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, он говорит, что "неопределенный метод` name '"

1 Ответ

2 голосов
/ 03 августа 2010

Вы можете использовать свойство :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_id и recipient_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
...