非持久性ActiveRecord模型属性

Rad*_*scu 42 activerecord ruby-on-rails

我想向现有模型添加一些不需要持久化的属性,甚至是映射到数据库列的属性.是否有解决方案来指定这样的事情?

apn*_*ing 52

当然要用好老红宝石attr_accessor.在你的模型中:

attr_accessor :foo, :bar
Run Code Online (Sandbox Code Playgroud)

你将能够做到:

object.foo = 'baz'
object.foo #=> 'baz'
Run Code Online (Sandbox Code Playgroud)

  • 如何以对象的JSON格式获取此属性?说,我希望此属性出现在客户端对象的JSON中.我能得到它吗?截至目前我没有得到它,即使我在我的创建方法中设置它.怎么做? (17认同)

Rus*_*oms 28

我遇到了同样的问题,但我需要引导模型,因此在调用to_json之后属性必须保持不变.你需要为此做一件额外的事情.

正如apneadiving所述,最简单的方法是转到您的模型并添加:

attr_accessor :foo
Run Code Online (Sandbox Code Playgroud)

然后,您可以分配所需的属性.但是要使属性保持不变,您需要更改属性方法.在模型文件中添加此方法:

def attributes
  super.merge('foo' => self.foo)
end
Run Code Online (Sandbox Code Playgroud)


D. *_*ser 6

如果有人想知道如何将其呈现给视图,请使用render方法的方法参数,如下所示:

render json: {results: results}, methods: [:my_attribute]
Run Code Online (Sandbox Code Playgroud)

请注意,这仅适用于您在模型上设置attr_accessor并在控制器操作中设置属性,因为所选答案已解释.