我有一个序列化程序,它开始使数据库查询繁重,但并不是每次调用序列化程序时都需要所有查询。我想将一个URL参数传递给序列化程序,让它知道是否需要某个关联。但是,我似乎无法找到一种方法来调用options
,除非我在一个替代方法中。我是以错误的方式来做这件事的吗?基本示例:
class UserSerializer < ActiveModel::Serializer
has_many :notes, serializer: UserNotesSerializer if options['include_notes']
end
编辑返回的错误是:
*** NameError Exception: undefined local variable or method `options' for UserSerializer
第二次编辑:@options由于某种原因返回nil
,阻止我访问选项哈希。这是一个已知的问题吗?使用版本0.8.1
是这样的吗?
答案 0 :(得分:1)
@options
并不存在于班级。 Ruby首先评估序列化程序类和方法定义。然后创建一个选项哈希值,在渲染时将其传递给序列化程序类的新实例。访问这些选项的方法实际上在ActiveModel :: Serializer的更高版本中命名为instance_options
。
但是,你仍然可以完成你想要做的事情。最简单的方法是在渲染时使用except:
选项。当您不需要关联时,您可以通过include_notes: false
而不是传递except: [:notes]
。