通知协会 - 这是正确的方法吗?

时间:2013-02-01 18:00:12

标签: ruby-on-rails associations rails-activerecord

我有一个带有用户模型的Rails 3.2应用程序。我想添加一个可以由以下用例触发的通知机制:

  • 喜欢某人的个人资料
  • 评论某人的个人资料
  • 跟随某人

在所有情况下,一个用户根据其他用户将收到的行为生成通知。因此,有一个发件人和收件人通知。

我现在正在思考如何构建我的关联。到目前为止,我的模型如下所示:

notification.rb里

attr_accessible :content, :read_at, :recipient_id, :sender_id

belongs_to :sender,     class: :user
belongs_to :recipient,  class: :user

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以其惊人的简洁性再次欺骗了我!嗯,这就是我非常喜欢它的原因。

非常感谢,Shane!

notification.rb里

attr_accessible :content, :read_at, :recipient, :recipient_id, :sender, :sender_id

belongs_to :sender, class_name: "User"
belongs_to :recipient, class_name: "User"

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

1 个答案:

答案 0 :(得分:3)

这是完全正常的。下面是一个流行的开源应用程序Redmine中使用的相同模式的示例:

https://github.com/edavis10/redmine/blob/master/app/models/workflow_rule.rb#L23-L24

至于需要一种同时收到发送和接收通知的方法,这里的答案很适合基本需求。

Rails Model has_many with multiple foreign_keys