Полиморфные ассоциации, использующие поля типа Integer ID - PullRequest
9 голосов
/ 26 мая 2011

У меня есть таблица Foo, которая имеет полиморфную ассоциацию принадлежат_, называемую bar.Таблица foos имеет стандартный столбец bar_id.Однако вместо строкового столбца bar_type у меня есть целочисленный столбец bar_type_id.Этот столбец ссылается на столбец id в таблице bar_types.bar_types.name содержит имя класса, представляющего класс конкретного экземпляра bar.

Разрешает ли Rails (в идеале> = 2.3.10) этот тип полиморфной ассоциации?

Ответы [ 4 ]

10 голосов
/ 04 февраля 2012

Мы сделали это путем переопределения метода 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

В комментариях.rb

belongs_to :commentable, :polymorphic => true, :extend => CommentObjectType::ClassNamesAsInt
2 голосов
/ 05 ноября 2013

Я использую полиморфный целочисленный тип gem , написанный одним из моих коллег.Это немного проще в использовании, чем примеры, приведенные выше, на мой взгляд.Например, после настройки сопоставления вы изменяете с

belongs_to :actor,              polymorphic: true

на новый формат:

belongs_to :actor,              polymorphic: true, integer_type: true
0 голосов
/ 26 мая 2011

Я не уверен, но вы можете поиграть

belongs_to :bar, :class_name => proc{ BarType.find(self.bar_type_id).name }, :foreign_key => :bar_id
0 голосов
/ 26 мая 2011

Для этого есть два подхода.

Первый - это просто:

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

Второй может быть сложным:

set_inheritance_column :bar_type_id
...