Как отобразить определенное значение из вложенного хэша

#ruby-on-rails #ruby #ruby-on-rails-4

#ruby-on-rails #ruby #ruby-on-rails-4

Вопрос:

Я пытаюсь создать приложение, в котором пользователь мог бы преобразовать свое имя или слово с помощью химических элементов (например, логотип breaking bad). После нескольких вопросов здесь, попыток и долгих размышлений я понял, что нашел «идеальное» решение… (Хм, я надеюсь …)

Я бы хотел, чтобы, если я введу acalam для отображения следующего:

символы

Если ни один символ не совпадает, я сохраняю начальную запись, чтобы она могла быть: hello => He ll O (жирный символ представляет существующие химические символы)

Моя модель выглядит так (пока всего пара символов)

 class Convertor < ActiveRecord::Base

  def get_chemical
    symbols = {
        "ac" => {
          :chem_name => "Actinium",
          :number => 89,
          :symbol => "Ac",
          :molar => 227
          },
        "al" => {
          :chem_name => "Aluminium",
          :number => 13,
          :symbol => "Al",
          :molar => 26.981539
          },
        "am" => {
         :chem_name => "Americium",
         :number => 95,
         :symbol => "Am",
         :molar => 243
            }
          }

      #not sure how to use this
      result=[]
      symbols.each do |key, value|
        value.each do |key2, value2|
          result << value2
        end
        result
      end


      name.downcase.gsub!(Regexp.union(symbols.keys), symbols) 
   
  end

end
  

Это представление

   .col-xs-12
    .number
      = @convertor.get_chemical # plus something? 
    .symbol
      = @convertor.get_chemical # plus something?
    .molar
      = @convertor.get_chemical # plus something?
    .chem_name
      = @convertor.get_chemical # plus something? 
  

На данный момент мое представление выглядит так: (введите описание изображения здесь

Редактировать

Это все химические символы, так что я должен сделать условие для каждого? Или есть лучший способ?введите описание изображения здесь

Комментарии:

1. С какой проблемой вы столкнулись?

2. Я не знаю, как извлечь нужные мне значения

Ответ №1:

Символы имеют длину один или два символа, верно? Вы должны решить, какой из двух символов вы собираетесь искать первым: скажем, 2 символа, затем 1.

Для «Привет»

Найдите в хэше следующую несопоставимую пару: Он, потому что это хэш, вам не нужно зацикливаться, просто спросите symbols.include? 'He' , переходит ли, если да, к следующей непревзойденной паре. Если этого не произойдет, найдите только ‘H’ и повторите.

Появляется первая буква «l», и она не совпадает, «ll» тоже не совпадает, просто верните «l», то же самое со второй «l», и в итоге вы получите

Он л л О

Когда хэш содержит нужный вам символ, просто верните его:

 lookup = 'He'
symbols[lookup]
symbols[lookup][:chem_name]
  

Комментарии:

1. Пожалуйста, посмотрите мое редактирование, я добавил таблицу символов. Символы также могут иметь 3 символа. Итак, я должен выполнить 103 разных условия?

2. Единственные химические символы, длина которых может составлять три символа, являются редкими и не составляют слово или имя; в них есть несколько слов / имен с символами с двойным U. Я бы проигнорировал эту возможность, по крайней мере, для первой реализации. Это слишком отдаленная возможность.

3. ваше право, но я посмотрю, включу ли я их, потому что некоторые люди могут играть, набирая дерьмовые вещи, хе-хе

4. Не 103 разных условия, но все символы должны быть в хэше. Затем вы просто запрашиваете хэш до 3 раз: symbols.include? 'Hel' , symbols.include? 'He' и symbols.include? 'H' если вы не нашли результат в первых двух. Давайте не будем обновлять мой ответ, пока мы не выясним два, добавив 3 ответа с символами, после этого момента тривиально.