Просто используйте строковые ключи, если можете. Во всех примерах документации используются строковые ключи. Хотя это явно не упоминается, насколько я вижу, другие ключи не поддерживаются.
Ключевые аргументы передаются непосредственно в реализацию кэша, поэтому разные варианты кэширования могут расходиться во мнениях относительно того, принимают ли они что-либо, кроме строк.
Поскольку кеши являются внешними, за исключением кеша в памяти, я не уверен, что вспомогательные символы будут полезны, кроме предотвращения таких случаев, как ваш. Ключ на самом деле будет записан куда-то в какой-то выход (это не только внутреннее приложение Ruby), поэтому концептуально ключ должен быть строкой.
Редактировать в ответ на комментарий: да, конечно, возможно и совершенно разумно в этом случае создать обезьяний патч, чтобы обойти необходимость изменять все вызовы. Что вы предлагаете, так это (скопировано в ответ для удобочитаемости):
class MemCache
def get_server_for_key_with_symbols(key, options = {})
key = key.to_s if key.is_a? Symbol
get_server_for_key_without_symbols(key, options)
end
alias_method_chain :get_server_for_key, :symbols
end
Я бы также подумал о том, чтобы просто выполнить поиск и замену по всему проекту для \.fetch(:\w+)
и заменить его на \.fetch("$1")
(при необходимости повторить для read
и write
). Вероятно, это должно охватывать 95% всех случаев, а последующий запуск вашего набора тестов должен выявить остальные ошибки.
В целом: несмотря на то, что в наши дни документация по Rails довольно хороша, многие допущения, к сожалению, все еще неявны. Как правило, рекомендуется внимательно изучить примеры, приведенные в документации, и использовать тот же стиль. Задокументированные примеры всегда показывают, как предполагается использовать фреймворк.
person
molf
schedule
25.02.2010