Rails Method_missing для возврата значений из хеша

Я пытаюсь написать метод method_missing, так что когда я запускаю метод, он должен нажать на хеш и посмотреть на ключи, если он найдет совпадение для возврата значения. и продолжай. хеш заполняется из SQL-запроса, который я написал, поэтому значения никогда не являются постоянными.

пример будет как

 @month_id.number_of_white_envelopes_made

в хеш

 @data_hash[number_of_white_envelopes_made] => 1

поэтому @month_id вернет 1. Я никогда не работал с ним раньше, не так много материала там с использованием хэшей, так как откат с отсутствующим методом

РЕДАКТИРОВАТЬ: извините, я забыл сказать, что если он не находит метод в хэше, то он может продолжаться вплоть до ошибки метода

РЕДАКТИРОВАТЬ: хорошо, так что я взломал, и это то, что я придумал

 def method_missing(method)
   if @data_hash.has_key? method.to_sym
     return @data_hash[method]
   else
     super
   end
 end

Есть ли способ лучше?

2 ответа

Решение

Как насчет чего-то вроде:

def method_missing(method_sym, *arguments, &block)
  if @data_hash.include? method_sym
    @data_hash[method_sym]
  else
    super
  end
end

И всегда помните, чтобы добавить соответствующий response_to? к вашему объекту:

def respond_to?(method_sym, include_private = false)
  if @data_hash.include? method_sym
    true
  else
    super
  end
end

Самый короткий

class Hash
  def method_missing(sym,*)
    fetch(sym){fetch(sym.to_s){super}}
  end
end

который первым пытается hash[:key] а потом hash["key"]

Другие вопросы по тегам