如何使用Rails 5的ActiveRecord属性提供虚拟列

问题描述 投票:1回答:3

我想将虚拟列添加到我的某些模型中,但要让它们的值由Product.first之类的ActiveRecord语句返回,以便可以使用Product.first.to_json之类的语句将虚拟列与产品一起输出API请求。

列的值取决于其他模型属性。我希望这些列保留到数据库中。

我尝试过:

class Product < ApplicationRecord
  def total
    price + tax
  end
end

但是Product.first不包括总数。

class Product < ApplicationRecord
  attribute :total, :decimal, default: -> { 0.0 }
end

向返回的对象添加total: 0.0,但

class Product < ApplicationRecord
  attribute :total, :decimal, default: -> { price + tax }
end

失败,例如消息>>

#<NameError: undefined local variable or method `price' for #<Class:0x0000557b51c2c960>>

class Product < ApplicationRecord
  attribute :total, :decimal, default: -> { 0.0 }

  def total
    price + tax
  end
end

仍然返回total: 0.0

我什至不确定attribute是否是执行此操作的正确方法,因为文档似乎暗示它已绑定到列。

总结:

  • products表不应包含total列。
  • 通过ActiveRecord访问Product应该返回一个Product对象,该对象包括一个total键,该键具有基于模型的其他属性的计算值。
  • 这甚至有可能吗?

真的

不想用大量代码手动插入这些虚拟列来替换每个to_json调用...

我想向我的某些模型中添加虚拟列,但是要让它们的值由ActiveRecord语句(例如Product.first)返回,以便我可以使用Product.first.to_json这样的语句来输出...

ruby-on-rails ruby-on-rails-5 rails-activerecord
3个回答
2
投票
在模型中覆盖as_json以包括您的方法。

3
投票
您可以使用methods选项

0
投票
A virtual/generated column(假设MySQL / MariaDB)将解决您的需求。由于它是从其他列的数据生成的,因此您无法对其进行写入,并且只能在读取操作期间对其进行更新。可以选择保留数据,但这不是这里的问题。
© www.soinside.com 2019 - 2024. All rights reserved.