除非object.user == current_user,否则活动模型序列化器关联

时间:2015-05-05 02:46:54

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

我有一个用户模型和就业模型,如下所示:

Class User
 has_many :employments

Class Employment
 belongs_to :user

我通过Active model serializer提供JSON API,如下所示:

class EmploymentSerializer < ActiveModel::Serializer
  attributes :id
  has_one :user

class UserSerializer < ActiveModel::Serializer
  attributes :id

一切都按预期运作。这就是问题所在:

当current_user是雇主时,我会使用用户关联加载工作,这可以正常工作。当current_user 雇主时,我想将所属的加载到用户。

作为EmploymentSerializer has_one:user,这会导致递归查询,其中current_user has_one就业has_one current_user无限期。

我尝试在EmploymentSerializer中添加此方法,但它不起作用:

def include_user?
  object.user != scope
end

如何加载current_user的工作?

解决方案

递归是由另一个序列化程序引起的,这个问题无关紧要。 AMS可以正常工作。

1 个答案:

答案 0 :(得分:1)

使用belongs_to,表接受外键的责任。对于has_one,该表期望另一个表保留它。由于您的Employments表具有Users表的外键,因此序列化程序中的has_one :user没有意义,因为它假定Users表具有外键到Employments表。

通常,序列化器关系通常应该反映模型,然后将它们混合在一起。当您的Employment班级有belongs_to :user关系时,您的序列化工具应该具有相同的关系,而不是相反的has_one关系。

修改 Ryan.lee的评论是正确的。在active_model_serializers中,has_one确实与belongs_to相同,因为序列化程序关注多重性和现在的所有权。但由于ActiveRecord,这很令人困惑,0.9版本也增加了对belongs_to的支持,以反映ActiveRecord关联。因此,当模型具有has_one时,在序列化程序中使用belongs_to确实是正确的,但我建议在序列化程序中使用belongs_to以避免混淆,因为它们mean the same thing在序列化器的上下文中(但是not ActiveRecord!