我的user.rb
文件中有以下常量,用于我的某个表单中的选择下拉菜单。它保存了一个数值。
在我看来,当我获得保存的数值时,我可以使用此常量来检索与其对应的名称并显示它吗?或者我是否必须制作一个处理此问题的单独数组?
LANGPROFICIENCY = [
["Elementary proficiency", 1],
["Limited working proficiency", 2],
["Professional working proficiency", 3],
["Full professional proficiency", 4],
["Native or bilingual proficiency", 5]
]
答案 0 :(得分:3)
首先,哈希是这类数据的一个很好的起点。而不是:
LANGPROFICIENCY = [
["Elementary proficiency", 1],
["Limited working proficiency", 2],
["Professional working proficiency", 3],
["Full professional proficiency", 4],
["Native or bilingual proficiency", 5]
]
使用:
LANGPROFICIENCY = {
"Elementary proficiency" => 1,
"Limited working proficiency" => 2,
"Professional working proficiency" => 3,
"Full professional proficiency" => 4,
"Native or bilingual proficiency" => 5
}
如果需要,您可以单独抓取keys
或values
,在您需要时单独抓取,或者您可以查找密钥以查找值,就像一直一样。
从那里你可以反转哈希:
Hash[*LANGPROFICIENCY.to_a.map{ |a| a.reverse }.flatten]
将返回:
{
1 => "Elementary proficiency",
2 => "Limited working proficiency",
3 => "Professional working proficiency",
4 => "Full professional proficiency",
5 => "Native or bilingual proficiency"
}
可以轻松进行反向查找。
如果你知道不会发生碰撞,那么一步走得更远,不应该有:
LANGPROFICIENCY = LANGPROFICIENCY.merge( Hash[ *LANGPROFICIENCY.to_a.map{ |a| a.reverse }.flatten ] )
导致:
{
"Elementary proficiency" => 1,
"Limited working proficiency" => 2,
"Professional working proficiency" => 3,
"Full professional proficiency" => 4,
"Native or bilingual proficiency" => 5,
1 => "Elementary proficiency",
2 => "Limited working proficiency",
3 => "Professional working proficiency",
4 => "Full professional proficiency",
5 => "Native or bilingual proficiency"
}
您可以向前,向前或向后查找。它会破坏你只抓住键或值的能力,但你可以在其中一个中间步骤找到解决方法。
我一直使用这个技巧,或者在这个主题上有变化。它使得使用一个变量来回映射变得非常容易。
现在,如果你一直在尝试IRB或Ruby中的每一步,你将收到多个关于“warning: already initialized constant LANGPROFICIENCY
”的警告。答案是使用变量而不是常量。此外,LANGPROFICIENCY几乎不是一个可读的变量名。我建议使用lang_proficiency
或类似的东西。
答案 1 :(得分:1)
如果你想得到这个名字,
LANGPROFICIENCY.rassoc(2)[0] #=> "Limited working proficiency"
但是如果您的数组要按升序排列数值,那么这里有很多冗余。而不是你拥有的,你可以简化它:
LANGPROFICIENCY = [
"Elementary proficiency",
"Limited working proficiency",
"Professional working proficiency",
"Full professional proficiency",
"Native or bilingual proficiency"
]
并做
LANGPROFICIENCY[2-1] #=> "Limited working proficiency"
答案 2 :(得分:1)
LANGPROFICIENCY
是一个数组数组。忽略它是一个常数,它只是意味着你无法改变它。
selected_entry = LANGPROFICIENCY.select {|entry| entry[1] == selected_id }
>> LANGPROFICIENCY = [["Elementary proficiency",1], ["Limited working proficiency",2], ["Professional working proficiency",3], ["Full professional proficiency",4], ["Native or bilingual proficiency",5]]
=> [["Elementary proficiency", 1], ["Limited working proficiency", 2], ["Professional working proficiency", 3], ["Full professional proficiency", 4], ["Native or bilingual proficiency", 5]]
>> selected_id = 3
=> 3
>> selected_entry = LANGPROFICIENCY.select {|entry| entry[1] == selected_id }
=> [["Professional working proficiency", 3]]
>> selected_entry.flatten
=> ["Professional working proficiency", 3]
假设您选择的索引位于selected_id
且值为3:
现在你有一个与LANGPROFICIENCY中的条目匹配的数组。
答案 3 :(得分:0)
您可以为视图创建一个帮助方法,它使用此常量从整数中检索熟练度。
你的助手看起来像这样:
def proficiency_from_value value
return LANGPROFICIENCY.flatten[2 * (value - 1)]
end