Вот полный ответ на этот вопрос, на случай, если люди, посещающие этот вопрос, являются новичками в Ruby on Rails и им трудно собрать все воедино (как мне было, когда я впервые изучил это).
Некоторые части решения выполняются в ваших миграциях, а некоторые — в ваших моделях:
Миграции
class CreatePrivateMessages < ActiveRecord::Migration
def change
create_table :private_messages do |t|
t.references :sender
t.references :recipient
end
# Rails 5+ only: add foreign keys
add_foreign_key :private_messages, :users, column: :sender_id, primary_key: :id
add_foreign_key :private_messages, :users, column: :recipient_id, primary_key: :id
end
end
Здесь вы указываете, что в этой таблице есть два столбца, которые будут называться :sender и :recipient и которые содержат ссылки на другую таблицу. Rails фактически создаст для вас столбцы с именами 'sender_id' и 'recipient_id'. В нашем случае каждая из них будет ссылаться на строки в таблице Users, но мы указываем это в моделях, а не в миграциях.
Модели
class PrivateMessage < ActiveRecord::Base
belongs_to :sender, :class_name => 'User'
belongs_to :recipient, :class_name => 'User'
end
Здесь вы создаете свойство модели PrivateMessage с именем :sender, а затем указываете, что это свойство связано с классом User. Rails, увидев «belongs_to :sender», будет искать в вашей базе данных столбец с именем «sender_id», который мы определили выше, и использовать его для хранения внешнего ключа. Затем вы делаете то же самое для получателя.
Это позволит вам получить доступ к вашему отправителю и получателю, обоим экземплярам модели пользователя, через экземпляр модели PrivateMessage, например:
@private_message.sender.name
@private_message.recipient.email
Вот ваша модель пользователя:
class User < ActiveRecord::Base
has_many :sent_private_messages, :class_name => 'PrivateMessage', :foreign_key => 'sender_id'
has_many :received_private_messages, :class_name => 'PrivateMessage', :foreign_key => 'recipient_id'
end
Здесь вы создаете свойство в пользовательской модели с именем :sent_private_messages, указывая, что это свойство связано с моделью PrivateMessage, и что внешний ключ в модели PrivateMessage, который связывает его с этим свойством, называется 'sender_id'. Затем вы делаете то же самое для полученных личных сообщений.
Это позволяет вам получить все пользователи, отправленные или полученные личные сообщения, выполнив что-то вроде этого:
@user.sent_private_messages
@user.received_private_messages
Выполнение любого из этих действий вернет массив экземпляров модели PrivateMessage.
....
person
Richard Jones
schedule
21.04.2012