Rails 3与foreign_type列的多态关联为整数

时间:2013-05-14 06:02:59

标签: ruby-on-rails activerecord polymorphic-associations

我们在rails / activerecord中存在多态关系的某个问题。 正如其他question 中所提到的那样。 我们需要这种与整数foreign_type列的多态关系的原因是表中的记录数,我们在该表中有大约4千万条记录,这个数字正在提高。我们尝试在数据库服务器上节省与数据库中索引处理有关的内存消耗。

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

我希望在迁移类

中看到这样的映射与列类型
class Notification < ActiveRecord::Base
  belongs_to :notifiable, :polymorphic => true
end
class User < ActiveRecord::Base
  attr_accessible :name
  has_many :notifications, :as => :notifiable
end
class Comment < ActiveRecord::Base
  attr_accessible :text
  has_many :notifications, :as => :notifiable
end
class Message < ActiveRecord::Base
  attr_accessible :title, :text
  has_many :notifications, :as => :notifiable
end
class Activity < ActiveRecord::Base
  attr_accessible :title, :description
  has_many :notifications, :as => :notifiable
end
class CreateNotification < ActiveRecord::Migration
  def change
    create_table :notifications do |t|
      t.integer :notifiable_id
      t.integer  :notifiable_type # should be a tinyint at the database
      t.timestamps
    end
  end
end

我想使用数值映射Comment和User,并将数值而不是类名保存为类型信息。

2 个答案:

答案 0 :(得分:2)

要使多态的belongs_to正常工作,您可以这样做:

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

然后在每个模型中,覆盖notifiable_type(将哈希定义为常量并将其放在您喜欢的任何位置):

def notifiable_type
  { 0: 'User', 1: 'Comment', 3: 'Message' }[read_attribute(:notifiable_type)]
end

has_many,试试这个(为每个模型设置INT_CLASS_TYPE):

has_many :notifications, :conditions => ["`notifiable_type` = ?", INT_CLASS_TYPE], :foreign_key => 'notifiable_id'

答案 1 :(得分:0)

你试过了吗?

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

Rails会假设你打电话给它; “notifiable_type”然后它 IS 一个类型。

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

您可能还需要添加一个notifiable_type模型,并为您拥有的每个类包含ID ......或者它可能只是工作......但这绝对是我开始的地方。