我正在将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列表在某些时候非常大。
答案 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
。
要查看发生了什么,请尝试在此处检查@objects
:https://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子查询是最有效的方法之一。
现在为我工作。