我们在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,并将数值而不是类名保存为类型信息。
答案 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 ......或者它可能只是工作......但这绝对是我开始的地方。