Bir modelin belirli bir sütunu / özniteliği olup olmadığı nasıl kontrol edilir?


123

Bir hash üzerinden döngü oluşturması ve her anahtarın bir modeller tablosunda olup olmadığını kontrol etmesi gereken bir yöntemim var, aksi takdirde anahtarı / değeri siler.

Örneğin

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

ve Numara tablosunda yalnızca bir: bir sütun vardır, bu nedenle: ikisi silinecektir.

Bir modelin bir niteliği olup olmadığını nasıl kontrol ederim?

Yanıtlar:


205

Bir sınıf için

Özelliğinizin dize adını Class.column_names.include? attr_namenerede kullanın attr_name.

Bu durumda: Number.column_names.include? 'one'

Bir örnek için

Kullanım record.has_attribute?(:attr_name)veya record.has_attribute?('attr_name')(Raylar 3.2+) veya record.attributes.has_key? attr_name.

Bu durumda: number.has_attribute?(:one)veya number.has_attribute?('one')veyanumber.attributes.has_key? 'one'


Bonus puanları için Hash#selectşunları kullanın :number_hash.select { |key, value| Number.column_names.include? key }
— hgmnz

28
Rails 3.2 ve üzeri sürümlerde, number.has_attribute?bir Sembolü veya
— Dizeyi

Bir nesne bir yöntemi başka bir nesneye devrederse, bu yöntemin yanlışlıkla sütunun var olduğunu önereceğine inanıyorum. Modellerimi a'ya sahip olanlar için kontrol ediyordum user, ancak bunun yerine user_idbazı modeller kullanıcıyı yetkilendirdiği için aramak zorunda kaldım .
— MattyB

Hash#has_key?lehine kullanımdan kaldırıldıHash#key?
— Charles Hamel

Attribute_method kullanmaya ne dersiniz ? sınıf için:Number.attribute_method? 'one'
— ouranos

13

Takma adları da kontrol etmeniz gerekiyorsa, Number.method_defined? attr_nameveya kullanabilirsiniz number.class.method_defined? attr_name.

Bunu alanları takma ad olan bir Mongoid nesnesi için yapmak zorundaydım.


ModelName.attribute_method? :attr_name
— Örneğimde

10

Örnek nesnenizde defined? instance.attributeveya kullanabilirsiniz instance.respond_to? :attribute.
Bunlar, bir model özelliğini veya herhangi bir yöntemi kontrol etmek için daha genel bir çözümdür.


3
Lütfen aklınızda bulundurun:instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true
— kbrock
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.