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?

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'


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.


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.


3
Harap diingat:instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true
kbrock
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.