我有一个带有用户模型的 Rails 3.2 应用程序。我想添加一个可以由以下用例触发的通知机制:
- 喜欢某人的个人资料
- 评论某人的个人资料
- 关注某人
在所有情况下,一个用户都会根据他的行为生成另一个用户将收到的通知。因此,存在通知的发送者和接收者。
我现在正在思考如何构建我的关联。到目前为止,我的模型如下所示:
通知.rb
attr_accessible :content, :read_at, :recipient_id, :sender_id
belongs_to :sender, class: :user
belongs_to :recipient, class: :user
用户.rb
has_many :notifications, as: :recipient, dependent: :destroy, foreign_key: :recipient_id
has_many :notifications, as: :sender, dependent: :destroy, foreign_key: :sender_id
这个伪代码只能帮助理解我需要什么——让我很困惑的是,我在通知模型中两次引用了用户模型,并且用户以两种不同的方式有许多通知。
所以,我的问题是:
- 您将如何调整上述关联?
- 你会怎么称呼他们?
- 我如何能够在用户模型上调用所有发送的通知和所有接收的通知,而无需编写范围?
- 这是正确的方法,还是我应该在两个地方使用连接表以避免两次引用用户?
谢谢!
解决方案
将 Shane 的解决方案用语言表达出来,这就是模型的外观。这真的比我想象的要容易得多。我以为我必须在这里做一些魔术 - 但 Rails 又一次以其惊人的简单性欺骗了我!嗯,这就是为什么我这么喜欢它。
非常感谢,谢恩!
通知.rb
attr_accessible :content, :read_at, :recipient, :recipient_id, :sender, :sender_id
belongs_to :sender, class_name: "User"
belongs_to :recipient, class_name: "User"
用户.rb
has_many :received_notifications, class_name: "Notification", foreign_key: "recipient_id", dependent: :destroy
has_many :sent_notifications, class_name: "Notification", foreign_key: "sender_id", dependent: :destroy