如何检查模型是不是具有某个列/属性?

Posted

技术标签:

【中文标题】如何检查模型是不是具有某个列/属性?【英文标题】:How to check if a model has a certain column/attribute?如何检查模型是否具有某个列/属性? 【发布时间】:2009-11-10 18:09:18 【问题描述】:

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

例如

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

并且 Number 表只有一个 :one 列,因此 :two 将被删除。

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

【问题讨论】:

【参考方案1】:

一堂课

使用Class.column_names.include? attr_name,其中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#select:number_hash.select |key, value| Number.column_names.include? key 在 Rails 3.2+ 中,使用number.has_attribute? 接受符号或字符串 我相信如果一个对象将一个方法委托给另一个对象,这个方法会错误地提示该列存在。我正在检查我的模型是否有 user 的模型,但由于某些模型委派了用户,因此不得不寻找 user_id 如何使用attribute_method? 上课:Number.attribute_method? 'one' 您可以简单地添加record.try(:column_name) 如果列不存在则返回nil【参考方案2】:

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

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

【讨论】:

我发现 ModelName.attribute_method? :attr_name 在我的实例中有效【参考方案3】:

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

【讨论】:

请记住:instance.respond_to?(:attribute) == false ; instance.attribute ; instance.respond_to?(:attribute) == true【参考方案4】:

如果非常简化

模型

记录列=属性

Model.columns Model.record.columns/attributes

检查模型的列是否存在 Foo.column_names.include? 'column_name'

记录是否存在该列? foo.has_attribute?('column_name')

属性

检查模型的属性是否存在 Foo.attribute_method?(:attribute_name)

记录的属性是否存在? foo.has_attribute?(:attribute_name)

方法

检查一个类的方法是否存在 Foo.method_defined?(:method_name)

该实例是否存在该方法? foo.respond_to?(:method_name)

【讨论】:

以上是关于如何检查模型是不是具有某个列/属性?的主要内容,如果未能解决你的问题,请参考以下文章

Waterline ORM - 检查数组属性是不是包含值

如何检查两个对象是不是具有相同的一组属性名称?

检查 XML 节点是不是具有 Linq C# 的属性?

如何检查特定属性是不是是有效的 ruby​​ on rails

如何检查对象是不是具有某些方法/属性?

如何检查对象是不是具有存储属性?