Игнорируя некоторые другие проблемы в вашем коде, то, что вы пытаетесь сделать с column
, можно сделать так:
collection.group_by { |item| item.send(column).strftime('%b %y') }
Это работает, потому что в Ruby способ доступа к переменным экземплярачерез методы доступа, обычно именуемые по переменной, к которой вы пытаетесь обратиться, поэтому @item.foobar
вызывает метод foobar
для @item
.
Теперь вернемся к этим "другим проблемам".Замечательно, что вы пытаетесь перенести повторяющееся поведение в одно место, и это показывает, что вы думаете о расширяемости, когда вы делаете вещи менее явными в пользу гибкости.Тем не менее, есть пара вещей, которые не очень хорошо сработают для вас, на что я вынужден указать.
Группировка работает на множестве типов данных, большинство из которых не отвечают на strftime
.Трудно кодируя вызов, вы вводите неожиданное поведение, которое означает, что вы не можете запустить group_collection(@users, :column => 'phone_number')
.Вместо этого запускайте его только после проверки того, что данные столбца могут на него реагировать.
collection.group_by do |item|
data = item.send(column)
data.respond_to?(:strftime) ? data.strftime('%b %y') : data
end
Если вы определите поведение этого вспомогательного метода для группировки по произвольному столбцу, выможет исключить дополнительную сложность принятия хэша опций, только чтобы обойти его.
def group_by_column(collection, column)
collection.group_by { ... }
end
group_by_column(@users, :column)
Вы можете сгруппировать по произвольному столбцу гораздо проще, если вы используете Ruby 1.9+и вам не нужно делать никакого дополнительного форматирования ..
@users.group_by &:created_at