【问题标题】:Why is Rail2's to_json's include option returning empty hashes?为什么 Rail2 的 to_json 的包含选项返回空哈希?
【发布时间】:2011-08-29 17:38:46
【问题描述】:

我正在尝试使用 Rails(2) 的 to_json 模型序列化机制从关联模型中发出一些数据。作为我的指南,我引用了以下基本相同的文档 URL:

这里是一些相关的模型代码:

class WorkEffortAssignment < ActiveRecord::Base
  belongs_to :work_effort
  belongs_to :assigned_to, :polymorphic => true
  belongs_to :assigned_by, :polymorphic => true

这是控制器代码,我只是想转储一些 JSON 用于初始测试目的:

def dump_work_effort_assignments
    WorkEffort.include_root_in_json = false
    all_assignments = WorkEffortAssignment.all
    options = {:include => [:work_effort, :assigned_to, :assigned_by], :only => [:work_effort_id, :assigned_to_id, :assigned_by_id]}
    ext_json = "{data:#{WorkEffortAssignment.all.to_json(options)}}"
    render :inline => ext_json
end

这是 Json 数据的第一条记录,其中 work_effort、assigned_to 和 assignment_by 的哈希为空:

{data:[{"assigned_to":{},"work_effort_id":"9","assigned_to_id":3,"assigned_by":{},"work_effort":{},"assigned_by_id":3}, //etcetera

但下面是我的控制台会话,显示了我想在我的 Json 中表示的关联。那么当我尝试为 to_json 指定包含选项时,我在控制器中做错了什么,这样我就可以轻松地将关联的模型数据发送回浏览器。提前致谢

>> assignment = WorkEffortAssignment.first
=> #<WorkEffortAssignment id: 1, assigned_at: nil, assigned_from: nil, assigned_
thru: nil, unassigned_at: nil, assigned_to_id: 3, assigned_to_type: "Party", ass
igned_by_id: 3, assigned_by_type: "Party", created_at: nil, updated_at: nil, wor
k_effort_id: "9">
>> assignment.work_effort
=> #<WorkEffort id: 9, description: "Software Architecture Document", type: nil,
 started_at: nil, finished_at: nil, projected_completion_time: nil, actual_compl
etion_time: nil, created_at: "2011-08-18 13:39:30", updated_at: "2011-08-25 13:3
9:30", facility_id: nil, facility_type: nil, work_effort_record_id: nil, work_ef
fort_record_type: nil, projected_cost_id: nil, actual_cost_id: nil, parent_id: n
il, lft: 1, rgt: 2>
>> assignment.assigned_to
=> #<Party id: 3, description: "George Jempty", business_party_id: 2, business_p
arty_type: "Individual", list_view_image_id: nil, enterprise_identifier: nil, cr
eated_at: "2011-08-29 14:21:41", updated_at: "2011-08-29 14:21:41">
>> assignment.assigned_by
=> #<Party id: 3, description: "George Jempty", business_party_id: 2, business_p
arty_type: "Individual", list_view_image_id: nil, enterprise_identifier: nil, cr
eated_at: "2011-08-29 14:21:41", updated_at: "2011-08-29 14:21:41">

【问题讨论】:

    标签: ruby-on-rails json activerecord


    【解决方案1】:

    你拥有的 :only 说明符将其丢弃。以下将包括子对象:

    def dump_work_effort_assignments
        WorkEffort.include_root_in_json = false
        all_assignments = WorkEffortAssignment.all
        options = {:include => [:work_effort, :assigned_to, :assigned_by]}
        ext_json = "{data:#{WorkEffortAssignment.all.to_json(options)}}"
        render :inline => ext_json
    end
    

    ...但不会过滤掉父级的属性。如果您想这样做,只需构建一个哈希并将其转换为 json 可能会更简单:

    def dump_work_effort_assignments
        data = WorkEffortAssignment.all.map {|wea| {
            :work_effort => wea.work_effort,
            :assigned_to => wea.assigned_to,
            :assigned_by => wea.assigned_by
        }}
        ext_json = "{data:#{data.to_json}}"
        render :inline => ext_json
    end
    

    【讨论】:

      猜你喜欢
      • 2014-02-24
      • 2018-10-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-08-26
      • 2011-03-08
      • 2021-03-20
      • 2013-11-21
      相关资源
      最近更新 更多