0

我正在尝试在 Rails 中设置通知系统以及 mongoid (但我不认为这是特定于 mongoid 的)。

基本结构是这样的 - 每个通知都有一个通知者(负责通知的人)和一个通知人(接收通知的人)。当用户 A 对用户 B 的帖子发表评论时(例如在博客系统中),用户 A 成为通知者,用户 B 是被通知者。

用户.rb

# nothing in here

通知.rb

has_one :notifier, :class_name => "User"
belongs_to :notifiee, :class_name => "User"

但是,当我这样做时:

@notification = Notification.new
@notification.notifier = current_user
@notification.notifiee = User.first #Just for the sake of the example
@notification.save

我收到此错误:

问题:当向 Notification#notifier 添加一个(n)用户时,Mongoid 无法确定要设置的反向外键。尝试的键是'notifiee_id'。摘要:当向关系添加文档时,Mongoid 尝试将新添加的文档链接到内存中关系的基础,并在数据库端设置外键以链接它们。在这种情况下,Mongoid 无法确定反向外键是什么。解决方案:如果不需要反向,例如 belongs_to 或 has_and_belongs_to_many,请确保在关系上设置 :inverse_of => nil。如果需要逆,很可能无法从关系的名称中找出逆,您需要明确地告诉 Mongoid 关系上的逆是什么。

我可能做错了什么?或者,有没有更好的方法来模拟这个?

任何帮助深表感谢!谢谢你。

4

1 回答 1

3

您可能应该选择以下关联:

用户:

has_many :notifications_as_notifier, :class_name=>'Notification', :foreign_key=>'notifier_id'
has_many :notifications_as_notifiee, :class_name=>'Notification', :foreign_key=>'notifiee_id'

通知:

belongs_to :notifier, :class_name=>'User', :foreign_key=>'notifier_id'
belongs_to :notifiee, :class_name=>'User', :foreign_key=>'notifiee_id'

你的notifications桌子应该有notifier_idnotifiee_id

现在你可以做,

@notification = Notification.new
@notification.notifier = current_user
@notification.notifiee = User.first #Just for the sake of the example
@notification.save

我在您的设置中发现有问题的地方:

你有,

has_one :notifier, :class_name => "User"
belongs_to :notifiee, :class_name => "User"

当您使用has_on时,其他关系(表)必须具有引用父级的外键。这里users必须有一个专栏notification_id什么的。这是不切实际的,因为单个用户有很多通知(根据您的解释)。

其次,您通过两个关系将通知关联到用户,但您提到了有关用于强制关联的外键的任何内容。

为什么你在用户模型中没有反比关系?如果您可以访问以下内容,这将无济于事:current_user.notifications_as_notifier??

于 2013-11-12T11:19:57.627 回答