Ruby on rails 获取组合数组和常量的哈希
我有这个数组Ruby on rails 获取组合数组和常量的哈希,ruby-on-rails,ruby,arrays,hash,Ruby On Rails,Ruby,Arrays,Hash,我有这个数组 Animals = ['sad cat','happy dog','vegetarian fish','hungry shark'] 这些常数是多少 SAD_CATS = {somekey : somevalue, otherkey : othervalue} HAPPY_DOGS = {somekey : somevalue, otherkey : othervalue} VEGETARIAN_FISH = {somekey : somevalue, otherkey : ot
Animals = ['sad cat','happy dog','vegetarian fish','hungry shark']
这些常数是多少
SAD_CATS = {somekey : somevalue, otherkey : othervalue}
HAPPY_DOGS = {somekey : somevalue, otherkey : othervalue}
VEGETARIAN_FISH = {somekey : somevalue, otherkey : othervalue}
HUNGRY_SHARKS = {somekey : somevalue, otherkey : othervalue}
哪种方法是最好的
RESULT = {'sad-cat' => SAD_CATS ,'happy-dog' => HAPPY_DOGS ,'vegetarian-fish' => VEGETARIAN_FISHES ,'hungry-shark' => HUNGRY_SHARKES }
请注意,常量是数组的复数和升格值
我试过了
RESULT = Animals.map(:¶meterize).map(:&upcase)
但它并不像我预期的那样有效
已编辑
因为FISHES不是英语我同意:
animals.each_with_object({}) do |a, h|
h[a.parameterize] = a.pluralize.upcase.tr(' ', '_').constantize
end
注:“鱼”的复数形式相同
文件:
数组中的元素表示单数实体,而常量(忽略大小写)表示复数实体(“悲伤猫”与“悲伤猫”或“素食鱼”与“素食鱼”) 我怀疑这种自动多元化在Ruby或Rails中是否可行 但是,如果常数为单数,则如下所示:
SAD_CAT = {somekey: somevalue, otherkey: othervalue}
HAPPY_DOG = {somekey: somevalue, otherkey: othervalue}
VEGETARIAN_FISH = {somekey: somevalue, otherkey: othervalue}
HUNGRY_SHARK = {somekey: somevalue, otherkey: othervalue}
然后,以下内容将为您提供所需的结果:
RESULT = Hash[Animals.collect { |x| [x, eval(x.gsub(' ', '_').upcase)] }]
希望这能有所帮助。如果您对基于Rails的解决方案没有意见,并且愿意更改“fish”和“shark”的复数形式以匹配Rails默认值,那么您可以使用以下方法。我修改了常量的值,使输出的验证更具可读性
Animals = ['sad cat','happy dog','vegetarian fish','hungry shark']
SAD_CATS = :cat_constant
HAPPY_DOGS = :dog_constant
VEGETARIAN_FISH = :fish_constant
HUNGRY_SHARKS = :shark_constant
Hash[Animals.map do |a|
[a.gsub(' ','-'), a.gsub(' ','_').pluralize.upcase.constantize]
end]
=> {"sad-cat"=>:cat_constant, "happy-dog"=>:dog_constant, "vegetarian-fish"=>:fish_constant, "hungry-shark"=>:shark_constant}
如果你想要一个只使用Ruby的解决方案,你可以使用这个。当然,如果愿意,您可以避免对String
进行猴子补丁
Animals = ['sad cat','happy dog','vegetarian fish','hungry shark']
SAD_CATS = :cat_constant
HAPPY_DOGS = :dog_constant
VEGETARIAN_FISHES = :fish_constant
HUNGRY_SHARKES = :shark_constant
class String
PLURALIZATION_EXCEPTIONS = {shark: 'es', fish: 'es'}
def pluralize
self+(PLURALIZATION_EXCEPTIONS[self.split(' ')[-1].to_sym] || 's')
end
end
Hash[Animals.map do |a|
[a.gsub(' ','-'), self.class.const_get(a.pluralize.gsub(' ','_').upcase)]
end]
=> {"sad-cat"=>:cat_constant, "happy-dog"=>:dog_constant, "vegetarian-fish"=>:fish_constant, "hungry-shark"=>:shark_constant}
以下是您的解决方案:
RESULT = Animals.inject({}) do |h, animal|
h.merge animal.parameterize => animal.pluralize.underscore.gsub(' ', '_').upcase.constantize
end
只是请注意,鲨鱼的复数形式不是“鲨鱼”,而是“鲨鱼”,而“鱼”的复数形式是。。。“鱼”。哪里定义了
参数化?@Bartosz你可以在你的帖子中添加这个链接,以增加它的易懂性。就这么做了。谢谢你的否决票,尽管这正是作者想要的。事实上,这并不是OP想要的。:-)你有没有把你的哈希键和op提供的哈希键做过比较?@PeterAlfvin,Bartosz我闻到忘恩负义的味道了吗?这里有一些很好的答案。发生了什么事?Rails确实通过ActiveSupport支持多元化是的,看到了你的答案,我很感激,尤其是没有使用“eval”。但我还是希望重命名常量,而不是重写这些方法,因为代码看起来简单且易于维护。您在评论中做了一些实质性的澄清(例如,愿意依赖Rails功能,愿意更改常量拼写以匹配Rails约定)。我建议您编辑您的问题,使其清晰明了,最好是添加一个补充说明,因为您已经在回答中付出了努力。另外请注意,您说过常数是“数组的复数和升格值”。我假设您的意思是“数组中的元素”,但无论如何,这忽略了您已将常量中的空格更改为下划线,并将示例哈希输出的键中的空格更改为破折号。:-)我删除了关于向下投票的注释。如果您澄清“注意常量是数组的复数和升格值”,这仍然会有帮助。关于键中的破折号,尤其是因为您的四个答案中有三个没有产生您在问题中包含的RESULT
的值。@PeterAlfvin我没有足够的声誉来否定任何东西…:(我的情况如下。我有一个数组,其中一些值来自DB。(我收到一个带有逗号分隔值的字符串,并将其转换为一个数组)我使用该数组做很多事情,例如绘制一些选项卡或标题等…在我需要与数组值相关的路由的地方,(sad cat
例如,用于sad cat
)。在另一个地方,我收到了该路由,我需要指向相关常数(在本例中为sad_cat)。实际上我硬编码了我的结果哈希,但如果我能从数组中自动生成它,对我来说会更容易。我很确定现在没有。'fish'。pluralize=>“fish”
Hmm.确实如此。我想我确认了…删除注释。这正是我要找的。虽然我在问题中犯了一个错误。动物
保留在模型中,但结果(以及其他哈希)应该保留在装饰器中。。。