我有这两节课:
class UserResult < ApplicationRecord
belongs_to :survey_result
has_many :phone_usages, class_name: 'PhoneUsage'
validates :user_uuid, presence: true
validates :period_start, presence: true
validates :period_end, presence: true
end
和
class PhoneUsage < ApplicationRecord
belongs_to :user_result, class_name: 'UserResult', foreign_key: 'user_result_id'
validates :start_time, presence: true
validates :end_time, presence: true
end
注意UserResult
-PhoneUsage
关系。
我获取了UserResult
并热切地加载了:phone_usages
:
@user_result = UserResult.includes(:phone_usages).where(user_uuid: params[:user_uuid])
,如果我遍历@user_result
,我可以看到:phone_usages
存在。
但是如果我这样做:
puts @user_result.inspect
我没有显示:phone_usages
:
<ActiveRecord::Relation [#<UserResult id: 1, survey_result_id: 1, user_uuid: "8147646e-2a47-4a0e-b907-8808ee5c5b94", period_start: "2019-04-11 22:01:55", period_end: "2019-04-11 22:01:59">, #<UserResult id: 2, survey_result_id: 2, user_uuid: "8147646e-2a47-4a0e-b907-8808ee5c5b94", period_start: "2019-04-11 22:05:38", period_end: "2019-04-11 22:05:56">]>
请注意,没有:phone_usages
。
我尝试了其他方法来获取:phone_usages
尝试puts @user_result.to_json
之后,我得到了:
{"id"=>1, "survey_result_id"=>1, "user_uuid"=>"8147646e-2a47-4a0e-b907-8808ee5c5b94", "period_start"=>Thu, 11 Apr 2019 22:01:55 UTC +00:00, "period_end"=>Thu, 11 Apr 2019 22:01:59 UTC +00:00}
{"id"=>2, "survey_result_id"=>2, "user_uuid"=>"8147646e-2a47-4a0e-b907-8808ee5c5b94", "period_start"=>Thu, 11 Apr 2019 22:05:38 UTC +00:00, "period_end"=>Thu, 11 Apr 2019 22:05:56 UTC +00:00}
尝试puts @user_result.phone_usages.inspect
给了我一个错误:
NoMethodError (undefined method 'phone_usages' for #<UserResult::ActiveRecord_Relation:0x000055e9144fb250>)
答案 0 :(得分:1)
includes
并不意味着您在用户内部看到phone_usages
。更像是,如果您在用户上调用phone_usages
,这不会触发查询,它已经被加载。现在,如果您想检查通过用户的phone_usages
,则可以
puts @user_result.flat_map(&:phone_usages).inspect
请注意,phone_usages
是您在单个用户而非用户关系上调用的关联。实际上,我的示例可以写得更明确
puts @user_result.map { |user| user.phone_usages }.flatten.inspect
如果要创建包含电话用法的JSON,请尝试
puts @user_result.as_json(include: :phone_usages)
请注意,如果您不想为每个用户触发一个查询,您仍然需要includes