2009-11-10 2 views
92

У меня есть метод, который должен пройти через хэш и проверить, существует ли каждый ключ в таблице моделей, иначе он удалит ключ/значение.Как проверить, имеет ли модель определенный столбец/атрибут?

, например

number_hash = { :one => "one", :two => "two" } 

и номер таблицы имеет только один столбец: так: два будут удалены.

Как проверить, имеет ли модель атрибут или нет?

ответ

159

Для класса

использования Class.column_names.include? attr_name где attr_name этого имя струны атрибута.

В этом случае: Number.column_names.include? 'one'

Для экземпляра

Использование record.has_attribute?(:attr_name) или record.has_attribute?('attr_name') (Rails 3.2+) или record.attributes.has_key? attr_name.

В этом случае: number.has_attribute?(:one) или number.has_attribute?('one') или number.attributes.has_key? 'one'

+0

Для получения бонусных очков используйте 'Hash # select':' number_hash.select {| key, value | Number.column_names.include? key} ' – hgmnz

+27

В Rails 3.2+ используйте' number.has_attribute? ', который принимает символ или строку –

+0

Я верю, что если объект делегирует метод другому объекту, этот метод ошибочно предложит, чтобы столбец существовал. Я проверял свои модели на те, у которых был «пользователь», но вместо этого нужно было искать 'user_id', поскольку некоторые модели делегировали пользователя. – MattyB

9

Если вам необходимо проверить наличие псевдонимов, а также, вы можете использовать Number.method_defined? attr_name или number.class.method_defined? attr_name.

Я должен был сделать это для объекта Mongoid, который имел псевдонимы.

+1

'ModelName.method_defined? : attr_name' работал хорошо! –

7

В вашем случае объект, вы также можете использовать defined? instance.attribute или instance.respond_to? :attribute.
Это более общее решение для проверки атрибута модели или любого метода.

+3

Обратите внимание: 'instance.respond_to? (: Attribute) == false; instance.attribute; instance.respond_to? (: attribute) == true' – kbrock

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