Як перевірити, чи модель має певний стовпець / атрибут?


123

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

наприклад

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

а в таблиці "Число" є лише: один стовпець так: два буде видалено.

Як перевірити, чи має модель атрибут чи ні?

Відповіді:


205

Для заняття

Використовуйте, 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'


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

28
У рельсах 3.2+, використовуйте number.has_attribute?який приймає символ чи струну
Марк-Андре Лафортун

Я вважаю, що якщо об’єкт делегує метод іншому об'єкту, цей метод помилково припустить, що стовпець існує. Я перевіряв свої моделі на ті, які мали user, але замість цього довелося шукати, user_idоскільки деякі моделі делеговані користувачем.
MattyB

Hash#has_key?застаріло на користьHash#key?
Чарльз Хамель

Як щодо використання attribute_method? для класу:Number.attribute_method? 'one'
ouranos

13

Якщо вам також потрібно перевірити псевдоніми, ви можете використовувати Number.method_defined? attr_nameабо number.class.method_defined? attr_name.

Мені довелося це зробити для монгоїдського об’єкта, який мав псевдонімні поля.


Я виявив, ModelName.attribute_method? :attr_nameщо працював у моєму випадку
колись

10

У вашому об'єкті екземпляра ви можете також використовувати defined? instance.attributeабо instance.respond_to? :attribute.
Це більш загальне рішення для перевірки атрибуту моделі чи будь-якого методу.


3
Майте на увазі:instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true
kbrock
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.