非持久性ActiveRecord模型属性

时间:2012-08-16 12:08:26

标签: ruby-on-rails activerecord

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

5 个答案:

答案 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