Возможно, есть лучший способ, но это мой выстрел.
ALLOWD_OPTIONS = [:s3, :scp, :ftp ,:sftp].freeze
type = ALLOWD_OPTIONS.detect { |e| e == backup.procedure.storage_name.to_sym }
if type
records = send(%s"Backup::Record::#{type.upcase}.all", :conditions => {:trigger => trigger})
end
или
if [:s3, :scp, :ftp, :sftp].include?(backup.procedure.storage_name.to_sym)
records = __send__ (%s"Backup::Record::#{backup.procedure.storage_name.to_sym.upcase}.all",
:conditions => {:trigger => trigger})
end
Вы можете использовать public_send()
для дополнительной безопасности, если вы используете Ruby 1.9. Я посмотрел на рассматриваемый файл. Есть много случаев. Вы можете создать приватный метод, чтобы сделать что-то, как я написал выше, чтобы минимизировать дублирование
ALLOWD_OPTIONS = [:s3, :scp, :ftp ,:sftp].freeze
records = send_method_with_type("all", backup.procedure.storage_name.to_sym,
:conditions => {:trigger => trigger})
private
def send_method_with_type(method, type, *args)
raise unless ALLOWD_OPTIONS.inlucde? type
send(%s"Backup::Record#{type.upcase}.#{method}", args)
end