ruby on rails-非持久ActiveRecord模型属性
我想将一些不需要持久化甚至映射到数据库列的属性添加到现有模型中。有解决方案来指定这样的事情吗?
Radu Stoenescu asked 2020-08-12T01:41:47Z
4个解决方案
52 votes
当然,请使用优质的旧红宝石attr_accessor
。在您的模型中:
attr_accessor :foo, :bar
您将可以执行以下操作:
object.foo = 'baz'
object.foo #=> 'baz'
28 votes
我遇到了同样的问题,但是我需要引导模型,因此该属性必须在to_json调用后保留。 您需要为此做一件事。
如呼吸暂停所述,最简单的开始方法是进入模型并添加:
attr_accessor :foo
然后,您可以分配所需的属性。 但是要使属性保持不变,您需要更改属性方法。 在模型文件中添加以下方法:
def attributes
super.merge('foo' => self.foo)
end
6 votes
如果有人想知道如何将其呈现到视图,请对render方法使用方法参数,如下所示:
render json: {results: results}, methods: [:my_attribute]
请注意,这仅在您在模型上设置attr_accessor并在控制器操作中设置属性时才有效,如选择的答案所述。
1 votes
就我而言,我想使用左联接来填充自定义属性。 如果我不添加任何东西,但是我也希望能够在新对象上设置属性,那么它就可以工作,当然它不存在。 如果我添加attr_accessor
,则它总是在select
之后返回nil
。这是我最终使用的方法,该方法适用于设置新对象并从左联接中检索。
after_initialize do
self.foo = nil unless @attributes.key?("foo")
end
def foo
@attributes["foo"]
end
def foo=(value)
@attributes["foo"] = value
end