2009-11-10 89 views
92

我有一个方法需要循环散列,并检查每个键是否存在于模型表中,否则将删除键/值。如何检查模型是否具有某个列/属性?

例如

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

和Number表只具有:一列这样:2将被删除。

如何检查模型是否有属性?

回答

159

对于一类

使用Class.column_names.include? attr_name其中attr_name是你的属性的字符串名称。

在这种情况下:Number.column_names.include? 'one'

对于实例

record.has_attribute?(:attr_name)使用或record.has_attribute?('attr_name')(滑轨3.2+)或record.attributes.has_key? attr_name

在这种情况下:number.has_attribute?(:one)number.has_attribute?('one')number.attributes.has_key? 'one'

+0

对于奖励积分,使用'Hash#select':'number_hash.select {| key,value | Number.column_names.include? key}' – hgmnz 2009-11-10 18:31:22

+27

在Rails 3.2+中,使用'number.has_attribute?',它接受符号或字符串 – 2012-07-18 17:25:24

+0

我相信,如果一个对象将一个方法委托给另一个对象,该方法将错误地建议该列存在。我正在检查我的模型中是否有'user',但是由于某些模型委托用户而不得不查找'user_id'。 – MattyB 2015-07-22 16:16:28

9

如果您需要检查的别名,以及,你可以使用Number.method_defined? attr_namenumber.class.method_defined? attr_name

我必须为具有别名字段的Mongoid对象执行此操作。

+1

'ModelName.method_defined? :attr_name'运行良好! – 2014-08-28 07:26:07

7

在您的实例对象中,您也可以使用defined? instance.attributeinstance.respond_to? :attribute
这些是检查模型属性或任何方法的更通用的解决方案。

+3

请记住:'instance.respond_to?(:attribute)== false; instance.attribute; instance.respond_to?(:attribute)== true' – kbrock 2016-03-24 05:30:35

相关问题