ruby-on-rails Ruby on Rails:在Json-API中,将参数传递给复合文档的内部序列化程序

wbrvyc0a  于 2023-02-01  发布在  Ruby
关注(0)|答案(1)|浏览(123)

对于使用jsonapi-serializer的ruby/rails JSON-API应用程序,假设我们希望支持如下查询:

https://example.com/movies/100?include=actors

假设我们有一个ActorSerializer的自定义属性,它需要一些模型中没有的数据,例如actors的当前位置:

class ActorSerializer
    include JSONAPI::Serializer

    set_type :actor
    attributes :first_name, :last_name

    attribute current_location do |object, params|
        params[:actor_locations][object.id]
    end
end

进一步假设我们正在从外部网站获得演员位置数据,该外部网站在一个查询中给出了所有演员的位置,并且为了性能的考虑,我们不希望每次请求调用这个网站超过一次。2因此,我们不希望current_location自定义方法必须调用外部网站,因为一部电影可以有很多演员。相反,我们在控制器方法创建要呈现的JSON序列化程序对象之前,在控制器方法中完成查询。
虽然我可以看到如何处理将位置数据作为参数传递以在Actor控制器中生成ActorSerializer,但我不确定如何从Movie控制器获取传递到那里的数据,该控制器可能会使用类似于以下内容的序列化器:

class MovieSerializer
    include JSONAPI::Serializer

    set_type :movie
    attributes :title, :year, :rating

    has_many :actors

end

现在,我并不特别关注作为序列化器参数到达那里的数据。据我所知,复合文档中内部序列化器的定制方法可能有一些其他的方法来获取控制器可以访问的数据。某种在整个请求中全局可用的数据等等?我是ruby和rails的新手。只是在寻找一个好的解决方案(我的实际问题不是关于电影和演员,而是更复杂)。

o7jaxewo

o7jaxewo1#

看来我的问题是由于假设ActiveRecords只能具有相应的DB记录中的示例数据而导致的。
因此,我所要做的就是为额外的数据创建一个属性,如下所示:

class Actor < ActiveRecord::Base
    ...
    attr_accessor :current_location
    ...
end

这样,控制器就可以查询外部服务,并用结果更新电影的所有演员记录。然后,序列化程序可以包含来自此属性的位置,而无需向序列化程序方法传递任何额外的参数。

相关问题