Rails: Как мне создать экземпляр класса в иерархии STI по ​​его хранимому типу? - PullRequest
0 голосов
/ 16 июля 2009

Допустим, я использую шаблон STI для сохранения нескольких различных подклассов «Транзакции», которые подклассы «ActiveRecord»

Мои подклассы могут включать «HighPriorityTransaction» и «LowPriorityTransaction», которые направляют в таблицу «транзакции» с столбцом «тип». Каждый подкласс имеет свою реализацию обратного вызова before_save.

Мой вопрос, как я могу создавать экземпляры этих классов по их строковому значению?

Я думаю, что я мог бы получить тип из комбинированного списка, создать экземпляр этого типа и позволить объекту обрабатывать обратный вызов before_save посредством полиморфизма. Будем признательны за любые дополнительные идеи по этому поводу.

Спасибо!

Ответы [ 3 ]

0 голосов
/ 16 июля 2009

Одна из проблем этого подхода заключается в том, что он позволяет клиенту вызывать создание экземпляров любого класса в вашем приложении, если ему известно его имя, если только вы явно не защититесь от этого в своем контроллере. Ниже приводится одна альтернатива, которая может работать. Он создает атрибут реестра в классе Transaction, который сопоставляет имена подклассов с объектами подкласса.

class Transaction

  class << self
    attr_reader :registry

    def inherited(sub)
      @registry ||= {}
      @registry[sub.name] = sub
    end
  end
end

class HighPriorityTransaction < Transaction; end

Transaction.registry["HighPriorityTransaction"].new.class # HighPriorityTransaction
0 голосов
/ 29 ноября 2009

Это может соответствовать тому, что вы ищете:

@transaction = "HighPriorityTransaction".camelize.constantize.new
0 голосов
/ 16 июля 2009

Я нашел одно решение, которым поделился:

type = Kernel.const_get("type_string") 

#which in this case might be 
#type = Kernel.const_get("HighPriorityTransaction")

transaction = type.new
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...