Вот полный ответ на этот вопрос, в случае, если люди, посещающие этот вопрос, являются новичками в 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
Здесь вы указываете, что в этой таблице есть два столбца, которые будут называться:отправитель и: получатель и которые содержат ссылки на другую таблицу.Rails фактически создаст для вас столбцы с именами 'sender_id' и 'receient_id'.В нашем случае они будут ссылаться на строки в таблице Users, но мы указываем это в моделях, а не в миграциях.
Models
class PrivateMessage < ActiveRecord::Base
belongs_to :sender, :class_name => 'User'
belongs_to :recipient, :class_name => 'User'
end
Здесь вы создаете свойство дляМодель PrivateMessage с именем: sender, затем указывающая, что это свойство связано с классом User.Rails, увидев «own_to: sender», будет искать в вашей базе данных столбец с именем «sender_id», который мы определили выше, и использовать его для хранения внешнего ключа.Затем вы делаете то же самое для получателя.
Это позволит вам получить доступ к вашему Отправителю и Получателю, оба экземпляра модели User, через экземпляр модели 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.
....