使用整数ID类型字段的多态关联

时间:2011-05-25 21:40:57

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

我有一个表Foo,它有一个名为bar的多态belongs_to关联。 foos表格具有标准bar_id列。但是,我有一个整数bar_type列,而不是基于字符串的bar_type_id列。此列引用表id中的bar_types列。 bar_types.name包含表示特定bar实例的类的类的名称。

Rails(理想情况下> = 2.3.10)是否允许这种类型的多态关联?

4 个答案:

答案 0 :(得分:10)

我们是通过覆盖新模块中的association_class方法并使用:extend选项将其包含在内来完成的。还创建了一个整数到字符串映射哈希,以使事情更容易。

config/initializers目录或您喜欢的任何地方,创建一个文件并定义哈希 INT_OBJECT_TYPE_TO_CLASSNAME = { 0 => "Project", 1 => "Task", 2 => "Timesheet" }

class CommentObjectType < ActiveRecord::Base
  module ClassNamesAsInt
    def association_class
      return INT_OBJECT_TYPE_TO_CLASSNAME[restricted_object_type].constantize
    end
  end
end

在comments.rb

belongs_to :commentable, :polymorphic => true, :extend => CommentObjectType::ClassNamesAsInt

答案 1 :(得分:2)

我正在使用我的一位同事写的polymorphic integer type宝石。在我看来,它比上面给出的例子稍微容易一些。例如,在配置映射后,您将从:

更改
belongs_to :actor,              polymorphic: true

采用新格式:

belongs_to :actor,              polymorphic: true, integer_type: true

答案 2 :(得分:0)

这有两种方法。

首先很容易:

has_many :bars, :conditions => "whatever you want"

第二个可能很棘手:

set_inheritance_column :bar_type_id

答案 3 :(得分:0)

我不确定,但你可以玩耍

belongs_to :bar, :class_name => proc{ BarType.find(self.bar_type_id).name }, :foreign_key => :bar_id