多态关联在rails admin上无法正确显示

时间:2015-10-09 17:26:50

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

我刚刚在我的应用中添加了一些通知功能。但是,当我在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_idobject_type已填充(54,申请人)

但在Rails管理员中,我明白了:

enter image description here

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

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

您似乎发现了Rails遭受的罕见和困扰的名称冲突之一。在Rails Guide to ActiveRecord Associations

中提到了这一点
  

3.2避免名称冲突

     

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

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

从具有名为object_id的列的表实例化模型时,会自动添加object_id属性。在某些时候,正在调用object_id方法来标识对象,但返回的值来自属性。因此问题。

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