Ruby集合乱序

时间:2013-03-05 14:19:03

标签: ruby

我有以下内容:

BB_AREAS = {
  :about          => {:link => "quem somos", :slug => "quem-somos"},
  :expositors     => {:link => "expositores",:slug => "expositores"},
  :map            => {:link => "planta", :slug => "planta"},
  :activities     => {:link => "atividades",:slug => "atividades"},
  :address        => {:link => "como chegar",:slug => "como-chegar"},
  :support        => {:link => "apoio", :slug => "apoio"},
  :optin          => {:link => "cadastro",:slug => "cadastro"},
  :how_expositors => {:link => "como expor",:slug => "como-expor"},
  :press          => {:link => "imprensa",:slug => "imprensa"},
  :contact        => {:link => "contato",:slug => "contato"},
}

BB_MENU_AREAS       = BB_AREAS.each_with_object({}) { |(k, v), h| h[k] = v[:link]}
BB_MENU_AREAS_SLUG  = BB_AREAS.each_with_object({}) { |(k, v), h| h[k] = v[:slug]}

在视图中我有以下内容:

=render :partial => '/shared/menu', :collection => BB_MENU_AREAS.map {|link, menu| {:link => link, :menu => menu}}, :spacer_template => '/shared/menu_separator'

我希望菜单以BB_AREAS的相同顺序呈现,但它以任意顺序呈现。

2 个答案:

答案 0 :(得分:3)

哈希按照Ruby 1.9+中的插入顺序排序,否则它们有内部订单。

IMO此数据属于实际对象数组;大致是:

class Area
  attr_accessor :name, :link, :slug
  def initialize(name, link, slug)
    @name = name
    @link = link
    @slug = slig
  end
end

BB_AREAS = [
  Area.new("About", "quem somos", "quem-somos"),
  Area.new("Expositors", "expositores", "expositores"),
  # etc.
]

如果实际需要按顺序提取单个组件。

答案 1 :(得分:0)

Ruby Hash在Ruby 1.8及更低版本中是无序的。但是,在Ruby 1.9及更高版本中,Hashes是有序的。但是有一个向后兼容的解决方案:

BB_AREAS = [
  [:about          , {:link => "quem somos", :slug => "quem-somos"}],
  [:expositors     , {:link => "expositores",:slug => "expositores"}],
  [:map            , {:link => "planta", :slug => "planta"}],
  [:activities     , {:link => "atividades",:slug => "atividades"}],
  [:address        , {:link => "como chegar",:slug => "como-chegar"}],
  [:support        , {:link => "apoio", :slug => "apoio"}],
  [:optin          , {:link => "cadastro",:slug => "cadastro"}],
  [:how_expositors , {:link => "como expor",:slug => "como-expor"}],
  [:press          , {:link => "imprensa",:slug => "imprensa"}],
  [:contact        , {:link => "contato",:slug => "contato"}],
]
BB_MENU_AREAS       = BB_AREAS.each_with_object({}) { |(k, v), h| h[k] = v[:link]}
BB_MENU_AREAS_SLUG  = BB_AREAS.each_with_object({}) { |(k, v), h| h[k] = v[:slug]}

您的观点没有任何改变。此外,在此数据结构中,您需要使用[key]

,而不是.assoc(key)[1]