如果访问这个问题的人是Ruby on Rails的新手,并且在将所有东西组合在一起时遇到了麻烦(就像我第一次调查时那样),那么下面是完整的答案。
解决方案的某些部分发生在您的迁移中,另一些部分发生在您的模型中:
迁移
class CreatePrivateMessages < ActiveRecord::Migration
def change
create_table :private_messages do |t|
t.references :sender
t.references :recipient
end
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"和"recipient_id"的列。在我们的情况下,它们将分别引用Users表中的行,但我们是在models中指定这些内容而不是在migrations中。
Models
class PrivateMessage < ActiveRecord::Base
belongs_to :sender, :class_name => 'User'
belongs_to :recipient, :class_name => 'User'
end
在PrivateMessage模型上创建一个名为:sender的属性,然后指定该属性与User类相关联。Rails会查找我们之前定义的名为"sender_id"的数据库列,并使用它来存储外键。对于接收者也是同样的操作。
这将允许您通过PrivateMessage模型的实例访问Sender和Recipient,它们都是User模型的实例,如下所示:
@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”的User Model属性,指定该属性与PrivateMessage Model相关,并且将PrivateMessage模型上与此属性相关的外键称为'sender_id'。然后,您对接收到的私人消息做同样的事情。
这使您可以通过执行以下操作获取用户发送或接收的所有私人消息:
@user.sent_private_messages
@user.received_private_messages
执行其中任一操作都将返回PrivateMessage模型的实例数组。
...
PrivateMessage
模型的class_name
键应该是符号。我无法自行编辑此内容,因为编辑必须至少包含 6 个字符。 - Tim Fletcherforeign_key
语句放入create_table
块中,像这样:t.references :sender, foreign_key: { to_table: 'users' }
。 - Toby 1 Kenobi