【问题标题】:Rails - ActiveModel::Serializer virtual attribute errorRails - ActiveModel::Serializer 虚拟属性错误
【发布时间】:2018-08-15 23:30:56
【问题描述】:

我将 active_model_serializers gem 用于 RoR API。版本:

导轨: 4.2.8

红宝石: 2.2.5

active_model_serializers: 0.10.0

我在序列化程序中使用虚拟属性。当我从数据库中检索对象时,我通过使用子查询来获取它。

您可以在这里找到代码:Github Gist

这是我得到的错误:

undefined method 'number_of_reservations' for DiscountSchedule...

该字段未在表中或模型中定义(attr_accessor)

我不确定为什么它不起作用,我有一个非常相似的序列化程序,它工作正常。

任何帮助将不胜感激。

编辑:

我有另一个序列化程序,其中虚拟/计算字段工作正常。我对此的猜测是,由于 AR 正在创建一堆 LEFT OUTER JOINS,并且查询的 SELECT 列表在某些时候非常大,所以有些东西会坏掉。

【问题讨论】:

  • 你能不能也分享一下序列化器和你的控制器的代码。
  • 为什么要截断错误?如果可能,显示完整的错误和堆栈跟踪。

标签: ruby-on-rails postgresql active-model-serializers


【解决方案1】:

该链接对我不起作用,因为我无法在我的工作地点访问,但是,从错误中我可以建议您检查您是否在序列化程序 attributes :number_of_reservations 中定义了这样的属性并有序列化程序中的一个动作,上面写着

def number_of_reservations
  // Your logic goes here.
end

【讨论】:

    【解决方案2】:

    我怀疑这个问题一定是关于 ActiveRecord,而不是 AMS。您正在尝试使用 select 和别名来收集一些计算(聚合)属性以及对象本身。不幸的是,这在 ActiveRecord 中不起作用,至少在 4.2.X 以下的版本中不起作用。这就是您观察到这种行为的原因,您的模型中没有 number_of_reservations

    要查看发生了什么,请尝试在此处检查@objectshttps://gist.github.com/LuisDeHaro/ebf92781b449aa1ee7b85f8f552dd672#file-some_controller-rb-L17

    【讨论】:

    • 没错,对象中没有 'number_of_reservations' 属性。但是由于某种原因,这在我拥有的另一个序列化程序中工作。但你可能是对的,罪魁祸首可能是 AR。我已经更新了我的 Q。
    • 您能否展示该工作的序列化程序和随附的查询?我想说的是,序列化程序库(如果它被正确设计并与 ORM 解耦)对您如何获取数据一无所知,它只是调用方法(属性)。第二个声明(最重要的)是 AR 不能向对象添加聚合属性(例如,Ecto 很容易做到这一点)。你可以做的是运行两个查询,一个来获取你想要的对象,然后在第二个中只选择你的计算属性,然后用.each 或其他东西填充你的模型上的属性。
    【解决方案3】:

    确实:问题出在 include(:table_name) 生成的大量 LEFT JOINS 上。然后序列化程序不知道该做什么。

    我发现了一个适用于 AR(Rails 4 和 5)的猴子补丁 gem,可以解决这个问题。

    https://github.com/alekseyl/rails_select_on_includes

    所以,虚拟字段 number_of_reservations 就像魅力一样被序列化程序拾取。

    而且,您可能想知道:为什么要检索不在数据库中的表定义中的字段。答:嗯,在某些情况下,您需要为要检索的每一行计算一个字段。 SQL 子查询是最有效的方法之一。

    它现在对我有用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-19
      相关资源
      最近更新 更多