我刚刚在我的应用中添加了一些通知功能。但是,当我在rails admin上检查通知时,它没有检测到相关的多态对象。 我只在开发中使用rails admin ..所以如果这是一个rails admin bug,那么我很高兴离开它。然而(并且很可能)如果我做错了什么,我需要解决它。
我应该提一下 - 这是在数据库中工作,并在网站上的任何地方工作,除了rails admin
我的模特
class Notification < ActiveRecord::Base
belongs_to :notified, polymorphic: true
belongs_to :object, polymorphic: true
belongs_to :user
scope :not_seen, -> { where(seen: false) }
scope :not_clicked, -> { where(clicked: false) }
def self.send_notifications(user, message, object, subscribers, mailer = nil, mailer_object = nil)
subscribers.uniq.each do |subscriber|
self.create({user: user, message: message, notified: subscriber, object: object}) unless subscriber.get_user_id == user.id
UserMailer.send(mailer, subscriber, mailer_object).deliver unless mailer.nil? || subscriber.get_user_id == user.id
end
end
end
All_Models_that_can_be_notified_about.rb
class .... < ActiveRecord::Base
..
has_many :notifications, as: :object
..
end
以下是创建通知的行
self.create({user: user, message: message, notified: subscriber, object: object}) unless subscriber.get_user_id == user.id
这是控制台上的样子:
<Notification id: 7, user_id: 1, message: " has left a comment on ", notified_id: 2, notified_type: "Programme", created_at: "2015-10-09 12:51:07", updated_at: "2015-10-09 12:51:07", seen: true, clicked: true, object_id: 54, object_type: "Applicant">
从上面可以看出,object_id
和object_type
已填充(54,申请人)
但在Rails管理员中,我明白了:
它正在检测模型是申请人,但它没有看到ID
有什么想法吗?
答案 0 :(得分:3)
您似乎发现了Rails遭受的罕见和困扰的名称冲突之一。在Rails Guide to ActiveRecord Associations
中提到了这一点3.2避免名称冲突
您不能自由使用任何名称作为您的关联。因为 创建关联会将具有该名称的方法添加到模型中 给关联一个已经用过的名称是一个坏主意 ActiveRecord :: Base的实例方法。关联方法会 覆盖基本方法并破坏事物。例如,属性或 连接是关联的坏名称。
object_id
由Ruby在所有对象上定义。它返回标识对象的数字ID,不幸的是(如您所发现的),可以使用另一个方法覆盖此方法,这是在创建名为object
的关联时发生的情况。
从具有名为object_id
的列的表实例化模型时,会自动添加object_id
属性。在某些时候,正在调用object_id
方法来标识对象,但返回的值来自属性。因此问题。
重新命名关联可能是解决这个问题的唯一方法。