覆盖包括块as_json

时间:2016-01-19 07:08:55

标签: ruby json ruby-on-rails-4

我在1:n关系中有两个模型(视图和网址)。 网址包含网址,状态,模式。并且将确切地将5个URL映射到视图。

假设我在urls表中有5条记录

|id | view_id | url    | state     | mode  |
| 1 | 1       |abc.com | recent    | abc   |
| 2 | 1       |cde.com | current   | 123   |
| 3 | 1       |efg.com | current   | def   |
| 4 | 1       |xyz.com | current   | 456   |
| 5 | 1       |nmo.com | recent    | xyz   |



class View < ActiveRecord::Base
  has_many :urls, dependent: :destroy

  def as_json options={}
    super(only: [], include: {urls: {only: [:url, :state, :mode]}})
  end
end

但是json不适合我。

预期的json就像

{
  current: {
    123: cde.com,
    def: efg.com,
    456:xyz.com
  },
  recent: {
    abc: abc.com,
    xyz: nom.com
}

我不知道如何通过重写as_json来获得这个json。 }

2 个答案:

答案 0 :(得分:0)

为什么不做这样的事情:

def as_json(options={})
  urls.inject(Hash.new{|hash, state| hash[state]={}}) do |memo, url|
    memo[url.state][url.mode] = url.url
    memo
  end.to_json
end

答案 1 :(得分:0)

我找到了两种方法

def as_json
    json = super(only: [], include: {urls: {only: [:url, :state, :mode]}})
    resource = Hash.new{ |h,k| h[k] = Hash.new(&h.default_proc) }
    json["urls"].each do |data|
        resource[ data["state"].to_sym ][ data["mode"].to_sym ] = data["url"]
    end
    resource
end

def as_resource
    resource = Hash.new{ |h,k| h[k] = Hash.new(&h.default_proc) }
    urls.each do |data|
        resource[ data.state.to_sym ][ data.mode.to_sym ] = data.url
    end
    resource
end