Ruby on rails Rails 3与外部类型列作为整数的多态关联

Ruby on rails Rails 3与外部类型列作为整数的多态关联,ruby-on-rails,activerecord,polymorphic-associations,Ruby On Rails,Activerecord,Polymorphic Associations,rails/activerecord中的多态关系存在一定的问题。 正如在另一篇文章中提到的。 我们需要这种带有整数外来类型列的多态关系的原因是表中的记录数,我们在该表中有大约4000万条记录,而且数量正在增加。我们试图在数据库服务器上节省存储空间,即与数据库中的索引处理有关的内存消耗 前面提到的问题与Rails 2有关,如果已经尝试将其用于Rails 3,但它不起作用。模块的方法从未被调用,我不明白为什么 我希望有一个这样的映射,列类型见迁移类 类通知true 结束 class用户:应通知 结

rails/activerecord中的多态关系存在一定的问题。 正如在另一篇文章中提到的。 我们需要这种带有整数外来类型列的多态关系的原因是表中的记录数,我们在该表中有大约4000万条记录,而且数量正在增加。我们试图在数据库服务器上节省存储空间,即与数据库中的索引处理有关的内存消耗

前面提到的问题与Rails 2有关,如果已经尝试将其用于Rails 3,但它不起作用。模块的方法从未被调用,我不明白为什么

我希望有一个这样的映射,列类型见迁移类

类通知true
结束
class用户:应通知
结束
class注释:应通知
结束
class消息:应通知
结束
类活动:应通知
结束
class CreateNotification
我想用数值映射注释和用户,并将数值而不是类名保存为类型信息。

是否尝试过:

class CreateNotification < ActiveRecord::Migration
  def change
    create_table :notifications do |t|
      t.integer :notifiable_id
      t.integer  :notifiable_type_id # should be a tinyint at the database
      t.timestamps
    end
  end
end
class CreateNotification
Rails将假定,如果您调用它;“应呈报类型”则是一种类型

但如果您将其称为notifiable_type_id,那么rails将假定它是属于notifiable_type模型的整数id


您可能还需要添加一个Notified_类型的模型,并包含您拥有的每个类的ID。。。或者它可能只是工作。。。但这绝对是我的出发点。

要使多态性工作起来,你可以这样做:

config/initializers
目录中,创建一个文件并放置以下行:

module ActiveRecord
  # = Active Record Belongs To Polymorphic Association
  module Associations
    class BelongsToPolymorphicAssociation < BelongsToAssociation #:nodoc:
      def klass
        type = owner.send(reflection.foreign_type)
        type.presence && type.constantize
      end
    end
  end
end
对于
有许多
,请尝试以下方法(为每个型号设置INT类类型):


真正地将“type”列从字符串更改为整数是成功与失败的区别吗?你分析过这个吗?最大的问题是你为什么要这样做?类型列是字符串是有原因的。为什么要它返回一个整数?为什么只是客人?@Tarynest这只是一个例子。我们已经建立了一个社交社区,并将任何触发器关联到一个通知表,可以是用户、活动、评论、参与、观察、私人消息等。。。目前,通知或新闻的数量约为4000万。我们试图节省1/4的数据存储空间。我认为花点时间调查是值得的。很酷,你已经添加了解释——这样做总是一个好主意——以防有一种假设你正在工作,可能你没有发现。在这种情况下,您的解释是有道理的,但我经常发现,当人们解释为什么他们要求修复时,实际上有一种更好的方法,他们没有想到,这就是为什么我总是问:)谢谢您的回答,但是“notifiable\u type\u id”会为不同的类添加到数据库中的哪个值?如果您已经测试了您的建议,但数据库列为空。正如我所说的-这是一个开始,而不是一个完整的解决方案。。。称之为读者的练习;)谢谢你给我一个开始的位置,但我没能比你的建议更进一步。我尝试过调试和重写方法,但我不能改变持久层的行为,它总是忽略值。也许设置为晚,但我看不出问题所在。也许您有另一个提示,什么地方是开始的好地方。class NotifiableTypedef notifiable_type { 0: 'User', 1: 'Comment', 3: 'Message' }[read_attribute(:notifiable_type)] end
has_many :notifications, :conditions => ["`notifiable_type` = ?", INT_CLASS_TYPE], :foreign_key => 'notifiable_id'