基于参数实例化一个对象集合的优雅方式?

时间:2016-02-23 21:22:14

标签: ruby-on-rails ruby oop

我有一个代表alert的JSON字符串,它传递给我的控制器...而JSON字符串中的一个参数是alert的类型。 I.E.恐慌alert,文书alert,硬盘alert等。

我的每个alert类型的对象都扩展了基类alert类。

class base_alert
    ...
end

class panic_alert < base_alert
    ...
end

class hard_drive_alert < base_alert
    ...
end

class instrument_alert < base_alert
    ...
end

是否有一种优雅的方法可以根据传入json字符串的参数有条件地实例化对象?

即。如果json参数用于恐慌警报,控制器将收到此信息并实例化恐慌alert类。

我真的不想要一个巨大的ifswitch声明。

2 个答案:

答案 0 :(得分:0)

您可以使用Object.const_get("class_name")来上课。如果它们不相似,您可以使它们相似或创建一个哈希常量来映射它们

即:

MAP = { 'alert_1' => 'hard_drive' }

Object.const_get(MAP['alert_1']).new
=> #<SomeClass:0x00000001fb2538>

答案 1 :(得分:0)

如果你对switch语句不利(可能被认为是最理想的)并且你的警报被作为一个数字传递,你存储一个ALERTS常量并使用一些元编程来实例化正确的警报:

# For example given an alert value a
ALERTS = {
  1 => "panic",
  2 => "hard_drive",
  3 => "instrument"
}

alert = eval("#{ALERTS[a]}_alert.new")