проблемы с рубиновыми символами в поиске по хешу

Я пытаюсь создать простой хэш для поиска соответствующих строк некоторым символам (:student_number,:first_name,...). У меня проблема с получением данных из этой функции. Вот функция

Фрагмент А

  def get_nice_column_name(col_symbol)
    column_names = { 
      :first_name => "Student's First Name",
      :last_name => "Student's Last Name", 
      :email => "Student's Email", 
      :given_name => "Student's Given Name"
    }
    return column_names[col_symbol]
  end

Вот как я это использую, но не работает:

Фрагмент Б

col_titles = []
params = {:first_name => 'true', 
          :last_name => 'true', 
          :email => 'true', 
          :given_name => 'true' }

params.each do |key, value|
  if ( value == 'true')
    col_titles << get_nice_column_name(key)
  end
end

Когда я просматриваю col_titles, я ожидаю ["Имя студента", "Фамилия студента"], но на самом деле ничего не получаю, просто [] пустой массив.

Я подумал, что это странно, поэтому я попытался распечатать object_id символов (col_symbol во фрагменте A) и символы в именах столбцов хэша, я получил разные object_id. Мне интересно, почему они разные (они оба представляют одни и те же символы). Если я добавлю это к функции get_nice_column_name во фрагменте A:

    puts "col_symbol is " + col_symbol.object_id.to_s + ", while :first_name is " + (:first_name).object_id.to_s
    puts "col_symbol is " + col_symbol.object_id.to_s + ", while :last_name is " + (:last_name).object_id.to_s
    puts "col_symbol is " + col_symbol.object_id.to_s + ", while :email is " + (:email).object_id.to_s
    puts "col_symbol is " + col_symbol.object_id.to_s + ", while :given_name is " + (:given_name).object_id.to_s

Я бы получил это в консоли

col_symbol is 98351040, while :first_name is 1221688
col_symbol is 98351040, while :last_name is 580888
col_symbol is 98351040, while :email is 168888
col_symbol is 98351040, while :given_name is 1290648

983541040 на самом деле не соответствует ни одному из {1221688, 580888, 168888, 1290648}. Поэтому мой get_nice_column_name бесполезен? Потому что символы под капотом другие?

Спасибо за помощь ребята !

С уважением


person Dominic    schedule 06.03.2011    source источник
comment
Я только что запустил в точности то, что вы перечислили выше, и это сработало в соответствии с вашим ожидаемым поведением. Это точный код, с которым у вас проблемы?   -  person dnch    schedule 07.03.2011
comment
Вау, ребята, спасибо за ответы. Проведя вчера всю ночь, я мог что-то перепутать. Я нашел, в чем проблема сейчас, массив params на самом деле является тем, что передается обратно из form_tag, так что да, это было не :first_name, а first_name. Теперь все снова имеет смысл. Спасибо, ребята, и я действительно хочу извиниться за путаницу.   -  person Dominic    schedule 07.03.2011


Ответы (1)


Если вы используете Ruby 1.9, это более краткий способ сделать это.

column_names = { 
  :first_name => "Student's First Name",
  :last_name  => "Student's Last Name",
  :email      => "Student's Email",
  :given_name => "Student's Given Name"
}

params = {
  :first_name => 'FirstName',
  :last_name  => 'LastName',
  :email      => 'Email',
  :given_name => 'GivenName'
}
col_titles = []

col_titles = column_names.values
data = params.values_at(*column_names.keys)

col_titles # => ["Student's First Name", "Student's Last Name", "Student's Email", "Student's Given Name"]
data # => ["FirstName", "LastName", "Email", "GivenName"]

Это использует преимущества нового поведения хэша Ruby 1.9, когда Ruby запоминает порядок вставки и будет соблюдать этот порядок при извлечении ключей и значений. Вы можете сделать что-то подобное с 1.8, но вам нужно будет определить порядок столбцов в массиве, а затем использовать его для извлечения заголовков столбцов и значений данных вместо того, чтобы полагаться на column_names для установки порядка.

person the Tin Man    schedule 07.03.2011
comment
Эй, спасибо за подсказку. Это выглядит намного чище, чем раньше! - person Dominic; 07.03.2011