我在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。 }
答案 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