Rails-ActiveModel :: Serializer虚拟属性错误

时间:2018-08-15 23:30:56

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

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

路轨: 4.2.8

Ruby: 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列表在某些时候非常大。

3 个答案:

答案 0 :(得分:0)

该链接对我不起作用,因为我在工作场所无权访问,但是,由于错误,我建议您检查是否在序列化程序attributes :number_of_reservations中定义了这样的属性并在序列化器中执行一个操作

def number_of_reservations
  // Your logic goes here.
end

答案 1 :(得分:0)

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

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

答案 2 :(得分:0)

确实:问题是由include(:table_name)正在生成的大量LEFT JOINS引起的。然后,序列化器不知道该怎么办。

我发现了一种猴子补丁宝石,可用于AR(第4和5条)来解决此问题。

https://github.com/alekseyl/rails_select_on_includes

因此,虚拟字段number_of_reservations像迷住了一样被序列化程序获取。

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

现在为我工作。