Rails/Ruby - 如何检查 attr_accessor 字段是否存在?

6
在Rails 3/4模型中,如果使用attr_accessor声明了一个字段field1
attr_accessor :field1

如何检查模型中是否存在field1column_exists?method_defined? 似乎只能用于模型列,而field1不是模型列。


Rails的版本是多少? - Hardik
您可以使用 yourvariable.field1 访问 fied1。 一旦您执行 variable = Model.new,该列就存在了。如果您想测试它是否为空,可以运行 variable.field1 === nil - LolWalid
Ruby on Rails 3.2或更高版本。 - user938363
2个回答

17

attr_accessor 定义了两个方法:def field1def field1=(val),因此你可以最好检查这两个函数是否存在。

如果你拥有一个对象:

object.respond_to? :field1
object.respond_to? :field1=
如果您不这样做,请使用:
Class.instance_methods.include? :field1
Class.instance_methods.include? :field1=

它会给你假阳性还是假阴性? - makhan
Class.instance_methods 返回 getter 和 setter。 - user938363
respond_to? 应该会给你正确的结果,这是基本的 Ruby。其他情况可能发生了,你的代码不是你所认为的或者你告诉我们的那样。https://gist.github.com/jrochkind/4864c69a33ba605e72da - jrochkind

1

attr_accessor 会在类中创建 getter 和 setter 方法。

在 Rails 中,column_names 方法会返回列名的数组。你可以检查一个列名是否存在于其中。

ModelClass.column_names.include?('column_name')

如果您不使用Rails,而只是使用纯粹的Ruby,并且想要检查Getter和Setter是否被定义,则应在对象上使用respond_to?方法。

2
ModelClass.column_names 只会返回表中的字段,而不会返回由 attr_accessor 定义的字段。 - user938363

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接