在Rails中渲染自定义json数组

时间:2019-08-21 11:18:52

标签: ruby-on-rails json ruby api response

在这里,我现在在@hours中有一个Hours数组,它与user和hour_type的关系。

Hours_controller.rb

def index
  @houra = Hour.all
  @users = User.where(id: @hours.map(&:user_id).uniq)
  @hour_type = HourType.where(id: @hours.map(&:hour_type_id).uniq)
  render json: {
    users: [@users],
    hour_type: [@hour_type],
    hours: @hours
  }
end

上面的代码给我的响应如下。

{
  "users": [
    "id": 6
  ],
  "hour_type": [
    "id": 69
  ],
  "hours": [
    {
      "id": 1,
    },
    {
      "id": 12
    },
    {
      "id": 2,
    }
  ]
}

但是现在我想要像下面这样的json中的响应。

{
  "users":[
    0:{
      user_id:2
    },
    1:{
      user_id:3
    },
  ],
"hours":[
0:[
  {
    hour_type_id:"1"
    hours: [
      {
        hour_id: 1
      },

        hour_id: 2
      },
    ]
  },
1:[
  {
    hour_type_id:"1"
    hours: [
      {
        hour_id: 1
      },
      {
        hour_id: 2
      },
    ]
  }
}

我该怎么做才能在json中获得相同的响应?

在这里,我要添加一些到我得到的结果附近

  @hours = Hour.all
  @users = User.where(id: @hours.map(&:user_id).uniq)
  @hour_types = HourType.where(id: @hours.map(&:hour_type_id).uniq)

  result = {
    users: @users,
    hours: []
  }

  @hour_types.each do |hour_type|
    hour_type_hash = {
      hour_type: hour_type,
      hours: Hour.where(hour_type_id: hour_type.id).all
    }
    result[:hours] << hour_type_hash
  end

渲染json:结果

现在只想在用户之前添加ID

1 个答案:

答案 0 :(得分:1)

这是一种非常幼稚的呈现方式,但这应该可以帮助您入门:

@hours = Hour.all
@users = User.where(id: @hours.map(&:user_id).uniq)
@hour_types = HourType.where(id: @hours.map(&:hour_type_id).uniq)

result = {
  users: @users.map{|u| {user_id: u.id} },
  hours: [] 
} 

@hour_types.each do |hour_type| 
  hour_type_hash = { 
    hour_type_id: hour_type.id, 
    hours: Hour.where(hour_type_id: hour_type.id).all.map{|h| {hour_id: h.id} } 
  }
  result[:hours] << hour_type_hash  
end 

render json: result_hash