繁体   English   中英

Rails 使模型方法显示为属性

[英]Rails make model methods appear as attributes

我有一个连接到 Postgres 数据库的模型。

class Person < ApplicationRecord

  def say_id
    "#{name} has id: #{id}"
  end

end

我有一些属性 id,name,email 以及上面的方法:say_id,可以通过以下方式访问:

person = Person.new
person.id => 1
person.say_id  => "John has id: 1"

我也希望将方法“say_id”列为属性,现在在运行 person.attributes 时,我只看到:id、name、email

如何将我的方法作为完整的可列出信息包含在内,就像 person.attributes 一样,但其中将包含我的方法? 一个用例是懒惰地将所有这些字段放在 Person 对象的表中。

在 Rails 5+ 中,您可以使用属性 api创建不受数据库列支持的属性:

class Person < ApplicationRecord
  attribute :foo
end
irb(main):002:0> Person.new.attributes
=> {"id"=>nil, "email"=>nil, "name"=>nil, "created_at"=>nil, "updated_at"=>nil, "foo"=>nil}

与使用attr_accessor不同,这些实际上的行为非常类似于数据库支持的属性。

如果你想,你可以重写 getter 方法:

class Person < ApplicationRecord
  attribute :foo

  def foo
    "foo is #{super}"
  end
end
irb(main):005:0> Person.new(foo: 'bar').foo
=> "foo is bar"

但是无论你在做什么,它仍然不是正确的答案。 您可以通过在类上调用.instance_methods来获取类的方法列表:

irb(main):007:0> Person.instance_methods(false)
=> [:foo]

传递false过滤掉继承的方法。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM