Bagaimana cara memeriksa apakah model memiliki kolom / atribut tertentu?

123

Saya memiliki metode yang perlu mengulang melalui hash dan memeriksa apakah setiap kunci ada dalam tabel model, jika tidak maka akan menghapus kunci / nilai.

sebagai contoh

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

dan tabel Number hanya memiliki kolom: satu jadi: dua akan dihapus.

Bagaimana cara memeriksa apakah model memiliki atribut atau tidak?

dMix
sumber

Jawaban:

205

Untuk kelas

Gunakan di Class.column_names.include? attr_namemana attr_namenama string atribut Anda.

Pada kasus ini: Number.column_names.include? 'one'

Misalnya

Gunakan record.has_attribute?(:attr_name)atau record.has_attribute?('attr_name')(Rails 3.2+) atau record.attributes.has_key? attr_name.

Dalam hal ini: number.has_attribute?(:one)atau number.has_attribute?('one')ataunumber.attributes.has_key? 'one'

Andy Stewart
sumber
Untuk penggunaan poin bonus Hash#select:number_hash.select { |key, value| Number.column_names.include? key }
hgmnz
28
Di Rails 3.2+, gunakan number.has_attribute?yang menerima Simbol atau String
Marc-André Lafortune
Saya percaya jika suatu objek mendelegasikan metode ke objek lain, metode ini akan secara keliru menyarankan kolom tersebut ada. Saya sedang memeriksa model saya untuk model yang memiliki user, tetapi harus mencari user_idkarena beberapa model mendelegasikan pengguna.
MattyB
Hash#has_key?tidak digunakan lagi demiHash#key?
Charles Hamel
Bagaimana kalau menggunakan attribute_method? untuk kelas:Number.attribute_method? 'one'
ouranos
13

Jika Anda juga perlu memeriksa alias, Anda dapat menggunakan Number.method_defined? attr_nameatau number.class.method_defined? attr_name.

Saya harus melakukan ini untuk objek Mongoid yang memiliki bidang alias.

Nick
sumber
Saya menemukan ModelName.attribute_method? :attr_nameapa yang berhasil dalam contoh saya
arah
10

Dalam objek instance Anda, Anda bisa menggunakan juga defined? instance.attributeatau instance.respond_to? :attribute.
Ini adalah solusi yang lebih umum untuk memeriksa atribut model atau metode apa pun juga.

Alter Lagos
sumber
3
Harap diingat:instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true
kbrock