【问题标题】:Polymorphic association not showing correctly on rails admin多态关联未在 rails admin 上正确显示
【发布时间】:2015-10-09 17:26:50
【问题描述】:

我刚刚在我的应用中添加了一些通知功能。但是,当我在 rails admin 上检查通知时,它没有检测到关联的多态对象。 我只在开发中使用 rails admin.. 所以如果这是一个 rails admin 错误,那么我很乐意离开它。但是(并且很可能)如果我做错了什么,我需要修复它。

我应该提一下 - 这是在数据库中工作,并且在站点的任何地方都可以工作,除了 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_idobject_type 已填充(54,申请人)

但在 Rails 管理员中,我得到了这个:

它检测到模型是申请人,但它没有看到 ID

有什么想法吗?

【问题讨论】:

  • object 是一个不幸的名称选择,因为 #object_id 已经被定义为 Ruby 对象的方法。我不知道这是否是问题的根源,但您可以考虑将object 更改为其他内容以避免潜在问题。
  • 谢谢!这就是问题的根源。如果您可以将此作为答案,我将很乐意接受。
  • 我也很怀疑。名称冲突可能很难调试。

标签: ruby-on-rails polymorphic-associations rails-admin ruby-on-rails-4.1


【解决方案1】:

您似乎发现了 Rails 遭受的罕见且令人烦恼的名称冲突之一。在Rails Guide to ActiveRecord Associations

中对此进行了非常简短的提及

3.2 避免名称冲突

您不能随意为您的关联使用任何名称。因为 创建关联会将具有该名称的方法添加到模型中,它 给一个关联一个已经用于的名称是一个坏主意 ActiveRecord::Base 的实例方法。关联方法将 覆盖基本方法并破坏事物。例如,属性或 连接是关联的坏名称。

object_id 由 Ruby 定义在所有对象上。它返回标识对象的数字 ID,不幸的是(正如您所发现的),可以用另一个方法覆盖此方法,当您创建一个名为 object 的关联时会发生这种情况。

object_id 属性会在从具有名为object_id 的列的表中实例化时自动添加。有时会调用object_id 方法来识别对象,但返回的值来自属性。于是就有了问题。

重命名关联可能是解决此问题的唯一方法。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-01-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多