gpt4 book ai didi

ruby-on-rails - Ruby on Rails - 引用同一模型两次?

转载 作者:行者123 更新时间:2023-12-03 06:06:09 26 4
gpt4 key购买 nike

是否可以通过generatescaffold命令在activerecord模型中设置双重关系?

例如,如果我有一个 User 模型和一个 PrivateMessage 模型,则 private_messages 表需要跟踪两个 sender收件人

显然,对于单一关系我会这样做:

ruby script/generate scaffold pm title:string content:string user:references

是否有类似的方法来建立两个关系?

此外,是否可以为关系设置别名?

所以不要说:

@message.user

你可以使用类似的东西:

@message.sender@message.recipient

如有任何建议,我们将不胜感激。

谢谢。

最佳答案

这里是这个问题的完整答案,以防访问这个问题的人是 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 模型的实例访问 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 的属性,指定该属性与 PrivateMessage 模型相关,并且 PrivateMessage 模型上与该属性相关的外键称为“sender_id”。然后,您对收到的私有(private)消息执行相同的操作。

这允许您通过执行以下操作来获取所有发送或接收私有(private)消息的用户:

@user.sent_private_messages
@user.received_private_messages

执行上述任一操作都会返回 PrivateMessage 模型的实例数组。

...

关于ruby-on-rails - Ruby on Rails - 引用同一模型两次?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2057210/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com