我正在尝试在Rails中设置一个通知系统,以及mongoid(但我不认为这是特定的mongoid)。
基本结构是这样的 - 每个通知都有一个通知程序(负责通知的人)和一个通知(接收通知的人)。当用户A对用户B的帖子进行评论时(例如在博客系统中),用户A成为通知者,用户B成为通知者。
User.rb
# nothing in here
notification.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
我收到此错误:
问题:将(n)用户添加到通知#通知程序时,Mongoid可以 不确定要设置的反向外键。尝试过的关键是 'notifiee_id'.Summary:在关系中添加文档时,Mongoid 尝试将新添加的文档链接到关系的基础 在内存中,以及设置外键以在数据库上链接它们 侧。在这种情况下,Mongoid无法确定反向是什么 外键是。分辨率:如果不需要反转,就像一个 belongs_to或has_and_belongs_to_many,确保:inverse_of =>零 在关系上设置。如果需要逆,很可能是 无法从你和你的关系名称中找出逆 将需要明确告诉Mongoid关于什么是逆的关系 是
我可能做错了什么?或者,有没有更好的方法来模拟这个??
非常感谢任何帮助!谢谢。
答案 0 :(得分: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_id
和notifiee_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
或其他内容。这是不切实际的,因为单个用户有很多通知(基于您的解释)。
其次,您通过两个关系将通知与用户关联,但您提到了有关用于强制关联的外键的任何信息。
为什么在User模型中没有反比关系?如果您可以访问类似的内容,那会无济于事:current_user.notifications_as_notifier
??