Ruby: динамический вызов доступных методов, вызывающих неопределенный метод (метапрограммирование) - PullRequest
1 голос
/ 22 апреля 2010

У меня есть объект Activerecord с именем Foo:

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

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

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

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

Спасибо.

Ответы [ 2 ]

2 голосов
/ 22 апреля 2010

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

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

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

0 голосов
/ 22 апреля 2010

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

...