Ruby: Динамично звонящие доступные методы, повышающие неопределенный метод (метапрограммирование)

Мне назвали объект Activerecord Foo:

Foo.attribute_names.each do |attribute|
  puts Foo.find(:all)[0].method(attribute.to_sym).call
end

Здесь я называю все атрибуты на этой модели (т.е., запрашивая для каждого значения столбца). Однако иногда я получу ошибку неопределенного метода.

Как может ActiveRecord:: Base#attribute_names возвращают название атрибута, которое при преобразовании в его собственный вызов метода повышает ошибку неопределенного метода?

Следует иметь в виду, что это только происходит на определенных объектах только для определенных методов. Я не могу определить шаблон.

Спасибо.

1
задан user94154 21 April 2010 в 23:29
поделиться

2 ответа

NoMethodError должен сообщать вам, какой метод не существует для какого объекта. Возможно ли, что ваш find не вернет записи? В этом случае [][0] равно nil , и вы обязательно получите NoMethodError .

Я бы использовал .fetch (0) вместо [0], и вы получите KeyError , если когда-либо не будет элемента с индексом 0.

Примечание: нет необходимости в to_sym ; все встроенные методы принимают методы имен в виде строк или символов (как в 1.8, так и в 1.9)

2
ответ дан 3 September 2019 в 01:07
поделиться

Может что-то делать с доступом? Например, если у класса есть атрибут attr_protected или что-то в этом роде. Или для атрибутов, которые не являются столбцами базы данных, для которых не определены средства доступа?

0
ответ дан 3 September 2019 в 01:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: