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.