我有很多常数:国内航班的平均长度,不同饮食类型的二氧化碳排放量,以及不同州的二氧化碳/千瓦时转换等等。我想把它们放在一个单独的文件中我的模型和控制器,但不太确定最佳实践是什么。这个文件应该是一个类,一个模块,还是两个都不是?我应该将它们放在models目录中吗?
示例:
class CalculatorConstants
AVERAGE_DOMESTIC_FLIGHT_LENGTH = 1070
class DietType
def initialize(name, co2e)
@name = name
@co2e = co2e
end
attr_reader (:name, :co2e)
end
average_diet = DietType.new('average', 684.915)
meaty = DietType.new('meaty', 867.964)
no_beef = DietType.new('no beef', 450.585)
pescatarian = DietType.new('pescatarian', 612.074)
vegetarian = DietType.new('vegetarian', 420.482)
vegan = DietType.new('vegan', 245.793)
DIET_TYPES = [average_diet, meaty, no_beef, pescatarian, vegetarian, vegan]
end
或
module CalculatorConstants
#Above Code
end
是不是?把它们放在哪里最好?
答案 0 :(得分:1)
我更喜欢将模块作为常量的命名空间。
module CalculatorConstants
AVERAGE_DOMESTIC_FLIGHT_LENGTH = 1070
DietType = Struct.new(:name, :co2e)
AVERAGE_DIET = DietType.new('average', 684.915)
# ...
DIET_TYPES = [AVERAGE_DIET]
end
p CalculatorConstants::DIET_TYPES
答案 1 :(得分:1)
我通常使用config gem来管理常量。它非常易于使用:只需将所有常量存储到YAML文件中,然后这些常量将在您的应用程序中可用。例如,
# config/settings.yml
flight_length: 1070
diet_types:
average: 684.915
meaty: 867.964
您可以通过
访问应用中的常量Settings.flight_length # => 1070
Settings.diet_types.average # => 684.915
答案 2 :(得分:0)
我通常通过在yaml文件中存储常量来解决这些问题,然后加载它们并通过哈希访问它们。
yaml文件的示例:
flight_length:
domestic: 1070
international: 3000
diet_types:
- type1
- type2
- type3
Ruby代码示例:
#loading
constants = YAML.load_file(path)
#saving
File.open(path, 'w') { |f| YAML.dump(constants, f) }
#use
puts constants[:flight_length].inspect
# => { domestic: 1070, international: 3000 }
puts constants[:flight_length][:domestic]
# => 1070
puts constants[:diet_types].inspect
# => [type1, type2, type3]
它结构合理,独立于ruby应用程序,可以在应用程序上下文之外轻松编辑,可以轻松地重复使用或转换,例如json用于javascript代码。
您可以根据需要将用于访问yaml文件中的值的方法和各种帮助程序包装为类或实例方法的类方法。如果你只是加载和保存,那么类方法可能更好。如果你有许多辅助方法,那么实例方法会更好。我不会选择模块。