我有以下型号:
class Appeal < ActiveRecord::Base
belongs_to :applicant, :autosave => true
belongs_to :appealer, :autosave => true
end
class Appealer < ActiveRecord::Base
has_many :appeals, :autosave => true
end
class Applicant < ActiveRecord::Base
has_many :appeals
end
我想要的是每位申诉人都可以提及他最后申诉的申请人
所以我将Appealer模型修改为:
class Appealer < ActiveRecord::Base
has_many :appeals, :autosave => true
def last_applicant
return self.appeals.last.applicant
end
end
但是我收到了错误:
undefined method `applicant' for nil:NilClass
奇怪的是,如果我调试它(通过RubyMine - Evaluate Expression)我可以得到申请人。
如果我试图获得最后一次上诉:
class Appealer < ActiveRecord::Base
has_many :appeals, :autosave => true
def last_appeal
return self.appeals.last
end
end
一切正常。
我正在使用active-model-serializer,尝试在序列化程序中也这样做(我实际上在特定的调用中需要这个值 - 而不是整个模型)但它也没有使用相同的错误。
AMS代码:
class AppealerTableSerializer < ActiveModel::Serializer
attributes :id, :appealer_id, :first_name, :last_name, :city
has_many :appeals, serializer: AppealMiniSerializer
def city
object.appeals.last.appealer.city
end
end
我的问题: 如何在JSON中获取嵌套对象属性? 我做错了什么?
修改 我的控制器电话:
class AppealersController < ApplicationController
def index
appealers = Appealer.all
render json: appealers, each_serializer: AppealerTableSerializer, include: 'appeal,applicant'
end
end
我尝试过使用和不使用包含,仍然无效
答案 0 :(得分:1)
也许我错过了一些东西,因为这看起来你的Appealer记录还没有任何上诉。
在这种情况下,此代码
def last_appeal
return self.appeals.last
end
将返回nil,它不会引发任何错误。但如果你打电话给这个
def last_applicant
return self.appeals.last.applicant
end
return self.appeals.last
为nil,您尝试在nil对象上调用applicant
方法而不是Appeal对象。
要修复它,只需添加检查nil
class Appealer < ActiveRecord::Base
has_many :appeals, :autosave => true
def last_applicant
last = self.appeals.last
if last.nil?
return nil
else
return last.applicant
end
end
end