モデルに特定の列/属性があるかどうかを確認するにはどうすればよいですか?


123

ハッシュをループしてモデルテーブルに各キーが存在するかどうかを確認する必要があるメソッドがあります。それ以外の場合は、キー/値が削除されます。

例えば

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

Numberテーブルには:oneカラムしかないので、:twoは削除されます。

モデルに属性があるかどうかを確認するにはどうすればよいですか?

回答:


205

クラス向け

Class.column_names.include? attr_namewhere attr_nameは属性の文字列名を使用します。

この場合: Number.column_names.include? 'one'

インスタンスの場合

使用record.has_attribute?(:attr_name)またはrecord.has_attribute?('attr_name')(Railsの3.2以上)またはrecord.attributes.has_key? attr_name

この場合:number.has_attribute?(:one)またはnumber.has_attribute?('one')またはnumber.attributes.has_key? 'one'


ボーナスポイントの使用Hash#selectnumber_hash.select { |key, value| Number.column_names.include? key }
hgmnz 09年

28
レール3.2+、使用中のnumber.has_attribute?記号または文字列を受け付ける
マルク・アンドレLafortune

オブジェクトがメソッドを別のオブジェクトに委譲した場合、このメソッドは誤って列が存在することを示唆すると思います。を持っているモデルがないかモデルをチェックしていましたuseruser_id、一部のモデルがユーザーを委任していたため、代わりに探す必要がありました。
MattyB

Hash#has_key?の代わりに廃止されますHash#key?
Charles Hamel、2015

attribute_methodの使用についてはどうですか?クラスの場合:Number.attribute_method? 'one'
Ouranos

13

エイリアスもチェックする必要がある場合は、Number.method_defined? attr_nameまたはを使用できますnumber.class.method_defined? attr_name

エイリアスフィールドを持つMongoidオブジェクトに対してこれを行わなければなりませんでした。


ModelName.attribute_method? :attr_name私のインスタンスで機能したものが見つかりました
方向転換

10

インスタンスオブジェクトでは、defined? instance.attributeまたはも使用できますinstance.respond_to? :attribute
これらは、モデル属性または任意のメソッドもチェックするためのより一般的なソリューションです。


3
覚えておいてください:instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true
kbrock 2016年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.