我有一个用户模型和就业模型,如下所示:
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可以正常工作。
答案 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!)