如何检查模型是否具有特定的列/属性?


123

我有一个方法需要遍历哈希并检查每个键是否存在于模型表中,否则它将删除键/值。

例如

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

而Number表仅包含:one列,因此:two将被删除。

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

Answers:


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

28
在Rails 3.2+,使用number.has_attribute?它接受一个符号或一个字符串
马克-安德烈Lafortune

我相信,如果一个对象将一个方法委托给另一个对象,则此方法将错误地表明该列存在。我正在检查我的模型中是否有user,但是user_id由于某些模型委派了用户,因此不得不寻找。
MattyB

Hash#has_key?不赞成使用Hash#key?
Charles Hamel

如何使用attribute_method?上一堂课:Number.attribute_method? 'one'
ouranos

13

如果还需要检查别名,则可以使用Number.method_defined? attr_namenumber.class.method_defined? attr_name

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


我发现ModelName.attribute_method? :attr_name在我的情况下起作用的是
某个方向

10

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


3
请记住:instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true
kbrock
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.