2012-04-25 2 views
0

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

примером может быть как

@month_id.number_of_white_envelopes_made 

в хэш

@data_hash[number_of_white_envelopes_made] => 1 

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

EDIT: извините, я забыл сказать, что если он не найдет метод в хэше, то он может продолжить работу до ошибки метода

EDIT: хорошо, так что я был рубил, и это то, что я придумал

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

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

+2

Как об использовании [OpenStruct] (http://www.ruby-doc.org/ stdlib-1.9.3/libdoc/ostruct/rdoc/OpenStruct.html)? Вы можете инициализировать экземпляр «OpenStruct» из хэша и ссылаться на его атрибуты с помощью синтаксиса 'struct.attribute'. Если значение отсутствует, оно просто вернет 'nil', но в противном случае выглядит так, как будто оно может работать для вас. –

+1

@ KL-7 +1 OpenStruct использует 'method_missing' под ним. – steenslag

+0

проблема в том, что есть слишком близко к 150 ключам? поэтому создание структуры будет делать намного больше работы. я размещаю его в презентаторе, поэтому методы разбросаны по программе иногда используются некоторые методы, а в других случаях будут использоваться другие методы, и если я использую хэш, как только метод, который будет вызываться, будет определяться, и следующий время, которое оно называется, будет сохранено в памяти – TheLegend

ответ

5

А что-то вроде:

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

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

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

Кратчайший является

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

который сначала пытается hash[:key], а затем hash["key"]

+0

очень круто мне нравится :) – TheLegend

+0

Добро пожаловать! Я только что узнал, что вы даже можете оставить обновленные аргументы :) – akuhn

Смежные вопросы