Ruby on rails Ruby:如何迭代散列并根据项目的数量做一些不同的事情?

Ruby on rails Ruby:如何迭代散列并根据项目的数量做一些不同的事情?,ruby-on-rails,ruby,Ruby On Rails,Ruby,我正在处理一个如下所示的哈希: h = { "side1"=>["green", "Green"], "side2"=>["verde", "Verde"] } h = { "side1"=>["green", "Green"], "side2"=>["verde", "Verde"] } h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.join(' and ') # "side1 fro

我正在处理一个如下所示的哈希:

h = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}
h = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}
h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.join(' and ')
# "side1 from green to Green and side2 from verde to Verde"

h = { 
    "side2"=>["verde", "Verde"]
}
h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.join(' and ')
# side2 from verde to Verde"
但是,其中可能只有一项:

h = { 
    "side2"=>["verde", "Verde"]
}
我想输出散列,使其看起来像这样:

h = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}
h = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}
h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.join(' and ')
# "side1 from green to Green and side2 from verde to Verde"

h = { 
    "side2"=>["verde", "Verde"]
}
h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.join(' and ')
# side2 from verde to Verde"
用户将side1从绿色更改为绿色,将side2从verde更改为绿色

当有两个项目时,将从“和”中分离。否则它将如下所示:

h = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}
h = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}
h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.join(' and ')
# "side1 from green to Green and side2 from verde to Verde"

h = { 
    "side2"=>["verde", "Verde"]
}
h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.join(' and ')
# side2 from verde to Verde"
用户将side2从verde更改为verde


这一切都发生在我的rails视图脚本中。我如何编写代码才能做到这一点?

您可以这样做:

h = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}
h = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}
h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.join(' and ')
# "side1 from green to Green and side2 from verde to Verde"

h = { 
    "side2"=>["verde", "Verde"]
}
h.map { |k,v| "#{k} from #{v[0]} to #{v[1]}" }.join(' and ')
# side2 from verde to Verde"
因此,雇员再培训局认为:

用户已更改。
如果您经常做这种事情,那么您可能需要为它构建一个助手

由于您在Rails中,因此也可以使用:

用户已更改。
to_句子
方法也可以更好地扩展到两个以上的元素。因此,如果您还有
“side3”=>[“pancakes”,“pancakes”]
,那么您将得到:

用户将side1从绿色更改为绿色,side2从verde更改为verde,side3从煎饼更改为煎饼。

这里有一个可能的解决方案:

hash = {
    "side1"=>["green", "Green"], 
    "side2"=>["verde", "Verde"]
}

result = hash.map do |key,value|
  "#{key} from #{value.first} to #{value.last}"
end

puts "User changed #{result.to_sentence}"
输出将是:

User changed side1 from green to Green and side2 from verde to Verde
而如果仅添加了一项:

User changed side1 from green to Green

+1对于to_句,我不知道这样的事情也存在。Rails提供了您所需的一切:)