2009-11-10 9 views
92

Mam metodę, która musi pętli przez hash i sprawdź, czy każdy klucz istnieje w tabeli modeli, w przeciwnym razie usunie klucz/wartość.Jak sprawdzić, czy model ma określoną kolumnę/atrybut?

np

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

i tabeli numer ma tylko jedną kolumnę: tak: dwa zostaną usunięte.

Jak sprawdzić, czy model ma atrybut, czy nie?

Odpowiedz

159

Dla klasy

Korzystanie Class.column_names.include? attr_name gdzie attr_name to nazwa ciąg atrybutu.

W tym przypadku: Number.column_names.include? 'one'

Dla przykładu

Zastosowanie record.has_attribute?(:attr_name) lub record.has_attribute?('attr_name') (szyny) lub 3.2 lub record.attributes.has_key? attr_name.

W tym przypadku: number.has_attribute?(:one) lub number.has_attribute?('one') lub number.attributes.has_key? 'one'

+0

Dla punktów bonusowych użyj 'Hash # select':' number_hash.select {| key, value | Number.column_names.include? key} ' – hgmnz

+27

W Railsach 3.2+ użyj' number.has_attribute? ', które akceptuje symbol lub ciąg znaków –

+0

Wierzę, że jeśli obiekt deleguje metodę do innego obiektu, ta metoda błędnie zasugeruje, że kolumna istnieje. Sprawdzałem swoje modele dla tych, które miały "użytkownika", ale musiałem zamiast tego szukać "user_id", ponieważ niektóre modele delegowały użytkownika. – MattyB

9

Jeśli trzeba sprawdzić dla aliasów, jak również można użyć Number.method_defined? attr_name lub number.class.method_defined? attr_name.

Musiałem to zrobić dla obiektu Mongoid, który miał aliasy pól.

+1

'ModelName.method_defined? : attr_name' działało dobrze! –

7

W obiekcie instancji można użyć także defined? instance.attribute lub instance.respond_to? :attribute.
Są to bardziej ogólne rozwiązanie umożliwiające sprawdzenie atrybutu modelu lub dowolnej metody.

+3

Należy pamiętać: 'instance.respond_to? (: Attribute) == false; instance.attribute; instance.respond_to? (: attribute) == true' – kbrock

Powiązane problemy