puts + .inspect不显示has_many属性

时间:2019-04-12 07:27:59

标签: ruby-on-rails ruby

我有这两节课:

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>)

1 个答案:

答案 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