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(:&parameterize).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.确实如此。我想我确认了…删除注释。这正是我要找的。虽然我在问题中犯了一个错误。
动物
保留在模型中,但
结果(以及其他哈希)应该保留在装饰器中。。。