我想在现有模型中添加一些不需要持久化的属性,甚至是映射到数据库列的属性。 是否有解决方案来指定这样的事情?
答案 0 :(得分:51)
当然要使用好的旧红宝石attr_accessor
。在你的模型中:
attr_accessor :foo, :bar
你将能够做到:
object.foo = 'baz'
object.foo #=> 'baz'
答案 1 :(得分:28)
我遇到了同样的问题,但我需要引导模型,因此在调用to_json之后属性必须保持不变。你需要做一件额外的事情。
正如apneadiving所述,最简单的方法是转到你的模型并添加:
attr_accessor :foo
然后您可以分配所需的属性。但是要使属性保持不变,您需要更改属性方法。在模型文件中添加此方法:
def attributes
super.merge('foo' => self.foo)
end
答案 2 :(得分:6)
如果有人想知道如何将其呈现给视图,请使用render方法的方法参数,如下所示:
render json: {results: results}, methods: [:my_attribute]
请注意,这仅适用于您在模型上设置attr_accessor并在控制器操作中设置属性,因为所选答案已解释。
答案 3 :(得分:1)
在我的情况下,我想使用左连接来填充自定义属性。如果我不添加任何东西,它也有效,但我也希望能够在新对象上设置属性,当然它不存在。如果我添加attr_accessor
,则它会在nil
之后返回select
。以下是我用来设置新对象并从左连接中检索的方法。
after_initialize do
self.foo = nil unless @attributes.key?("foo")
end
def foo
@attributes["foo"]
end
def foo=(value)
@attributes["foo"] = value
end
答案 4 :(得分:1)
从Rails 5.0开始,您可以使用attribute
:
class StoreListing < ActiveRecord::Base
attribute :non_persisted
attribute :non_persisted_complex, :integer, default: -1
end
使用attribute
可以创建属性,就像持久化属性一样,也就是说,您可以定义类型和其他选项,将其与create
方法一起使用,等等。
如果您的数据库表包含匹配的列,它将被保留,因为attribute
也用于影响现有列与SQL之间的转换。
请参阅:https://api.rubyonrails.org/classes/ActiveRecord/Attributes/ClassMethods.html#method-i-attribute