2014-10-18 66 views
0

我创建了一个模块结构来保存我不想存储在数据库中的静态数据。这样的事情:通过嵌套模块循环

module Vixen 
    module Cateories 
    module Amazon 
     module THREE_D_PRINTED_PRODUCTS 
     REFERAL_FEE_PERCENTAGE = .12 
     MINIMUM_REFERAL_FEE = 0 
     NAME = '3D Printed Products' 
     end 
     module AMAZON_DEVICE_ACCESSORIES 
     REFERAL_FEE_PERCENTAGE = .25 
     MINIMUM_REFERAL_FEE = 0 
     NAME = 'Amazon Device Accessories' 
     end 
     module AMAZON_KINDLE 
     REFERAL_FEE_PERCENTAGE = .15 
     MINIMUM_REFERAL_FEE = 0 
     NAME = 'Amazon Kindle' 
     end 
     module AUTOMOTIVE_AND_POWERSPORTS 
     REFERAL_FEE_PERCENTAGE = .12 
     MINIMUM_REFERAL_FEE = 1.00 
     NAME = 'Amazon Kindle' 
     end 
    end 
    end 
end 

我想选择模块下的元素。是否有可能像这样循环每个模块:

Vixen::Cateories::Amazon.each { | category | print category::NAME } 

我知道此代码不起作用。

+2

将数据存储在嵌套模块常量是一个聪明的想法,但它也太聪明了一半。嵌入散列的单个散列将更容易操作和迭代,并且作为将来可以从简单的YAML或JSON配置文件读入的东西的好处。常量旨在为定义它们的模块或类专用,而不是任意共享。这造成了一系列绑定关注并限制了您重构的能力。 – tadman 2014-10-18 04:14:44

+1

你说你“不想把它存储在数据库中”,这可能是今天合理的关注,但这可能在未来不成立。我可以看到这个文件从四个简单的东西成长为几十个,几百个东西,其中一些需要根据其他或条件计算出它们的值。然后你把自己涂在一个角落里。 – tadman 2014-10-18 04:16:17

+0

如果您发现答案有帮助,请考虑选择它。 – 2014-11-07 22:08:45

回答

2

我想这可能是你正在尝试做的事:

Vixen::Cateories::Amazon.constants.each do 
    |category| print Vixen::Cateories::Amazon.const_get("#{category}::NAME") 
end