我有一个代表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
类。
我真的不想要一个巨大的if
或switch
声明。
答案 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")