2014-02-28 27 views
0

在我的控制器看起来像这样的时候:更改JSON输出,返回`icd3_code_id`为`:id`

def search 
    @icd4 = Icd4Code.search_full(params[:search]).first(20) 
    render json: { icd: @icd4.as_json(:only => [:bezeichnung, :nummer, :id])} 
end 

什么,我想改变的是我的代码不会返回@icd4.id:id而是@icd4.icd3_code_id:id

所以render json: { icd: @icd4 }应该是这样的:

{"icd":[{"id":6,"nummer":"A00.1","bezeichnung":"Cholera","icd3_code_id":3,"created_at":"2014-02-28T19:38:20.530Z","updated_at":"2014-02-28T19:38:20.530Z"},{"id":7,"nummer":"A00.1","bezeichnung":"El-Tor-Cholera","icd3_code_id":3,"created_at":"2014-02-28T19:38:20.533Z","updated_at":"2014-02-28T19:38:20.533Z"}]} 

我的实际代码render json: { icd: @icd4.as_json(:only => [:bezeichnung, :nummer, :id])}返回此:

{"icd":[{"id":6,"nummer":"A00.1","bezeichnung":"Cholera"},{"id":7,"nummer":"A00.1","bezeichnung":"El-Tor-Cholera"}]} 

,我想这样的输出:

{"icd":[{"id":3,"nummer":"A00.1","bezeichnung":"Cholera"},{"id":7,"nummer":"A00.1","bezeichnung":"El-Tor-Cholera"}]} 

我怎样才能做到这一点?由于

回答

0

最简单的方法是巧妙地更改值这样的事情

def search 
    @icd4 = Icd4Code.search_full(params[:search]).first(20) 
    r = icd: @icd4.as_json(:only => [:bezeichnung, :nummer, :icd3_code_id]) 
    final_value = [] 
    r["icd"].each do |h| 
    f = {} 
    h.map do |k,v| 
    if k == 'icd3_code_id' 
    f["id"] = v 
    else 
     f[k] = v 
    end 
    end 
    final_value << f 
end 
render json: final_value 
end 
1

你一定要看看draperactive_model_serializers宝石。

http://railscasts.com/episodes/409-active-model-serializers

http://railscasts.com/episodes/286-draper

我虽然有点不同的方式,然后瑞恩·贝茨确实使用德雷珀,平时我做这样的事情:

render json: item.decorate.as_json 

例如,你可能一个简单的解决方案有此类:

class Icd4CodeDecorator < Draper::Decorator 
    decorates :icd4_code 
    delegate_all 

    def as_json(options={}) 
    { 
     id: icd3_code_id, 
     bezeichnung: bezeichnung, 
     nummer: nummer 
    } 
    end 
end 

,然后在你的控制器,你可以只是做:

render json: @icd4.decorate.as_json 

虽然我认为这将是更好地保持正确的东西在as_json方法和对id财产id返回值,并创建德雷珀继承了装饰类:: CollectionDecorator并定义有你的自定义的方法,是这样的:

class Icd4CodesDecorator < Draper::CollectionDecorator 
    def as_search_json 
    object.map do |o| 
     { 
     id: icd3_code_id, 
     bezeichnung: bezeichnung, 
     nummer: nummer 
     } 
    end 
    end 
end 

,然后在你的控制器,你可以这样做:

render json: Icd4CodesDecorator.new(@icd4).as_search_json 

通过这种方式,您可以轻松地为您的模型创建和维护任意数量的json输出版本。

1

没有你也可以在项目和他们的钥匙重复,当你发现你的重命名键串行。

@icd4 = Icd4Code.search_full(params[:search]).first(20) 
data = @icd4.as_json(:only => [:bezeichnung, :nummer, :icd3_code_id]).tap do |icd4_json| 
    icd4_json.each do |icd4_item| 
     icd4_item.each do |key| 
      icd4_item[ 'id' ] = icd4_item.delete(key) if key == 'icd3_code_id' 
     end 
    end 
end 
render json: { icd4: data }