RoR - Model.all,但没有created_at和updated_at字段

问题描述:

我是Ruby的新手,所以这个问题对你来说可能看起来很愚蠢,是的。但仍... 我有一个模型组,当我运行这个RoR - Model.all,但没有created_at和updated_at字段

class GroupsController < ApplicationController 
    prepend SimpleCommand 
    ... 
    def index 
     @group = Group.all 
     render json: @group 
    end 
    ... 
    # some other stuff 

...然后我得到这样与阵列响应:

[ 
    { 
    "id": 1020, 
    "name": "НІ-16-1", 
    "has_subgroups": true, 
    "created_at": "2017-09-29T10:14:08.000Z", 
    "updated_at": "2017-09-29T10:14:08.000Z" 
    } 
... 
] 

但我不想要有这两个最后的字段,所以我的回答是 如何摆脱响应中的“created_at”和“updated_at”字段?

UPD:

发现在原来的问题一个很好的解决方案,我不小心做了一个重复的。继续阅读吧

+0

@Cyzanfar哦,谢谢。我试过几次这样的谷歌类似的东西,但从来没有遇到与Yosh联系的答案。我用那里的答案来解决我的问题。 – Volkeee

每当您向视图提供对象时,JSON Rails在内部都会调用函数as_json。摆脱这两个领域的一种方法是重写功能,在您的Group型号:

class Group < ActiveRecord::Base 
     def as_json(options={}) 
     { id: id, 
      name: name, 
      has_subgroups: has_subgroups 
     } 
     end 
    end 

或者作为@MrYoshiji建议你可以过滤出来,像这样:

render json: @groups.to_json(except: [:created_at, :updated_at]) 
+0

'as_json'已经接受'only:[:some,:field]'和'except:[:other,:field]'(https://apidock.com/rails/ActiveResource/Base/as_json)选项 – MrYoshiji

+1

*认为@MrYoshiji说的(在另一个评论线程中)是使用模型中的''as_json''方法*随时*排除'created_at'和'updated_at' * *'Group'模型是转换为json。这是通过你的更新来解决的(使用'to_json'调用的参数)。但是,您现在在控制器中具有与我提议的方法相同数量的业务逻辑(比如它)。 – jvillian

+0

@jvillian我确认。您的(cyczanfar's)解决方案通过整个应用程序的“Group#as_json”调用来限制可用数据。在不同的*上下文*中,像'/ admin/groups.json',你可能需要那些'updated_at'和'created_at'的值 – MrYoshiji

Rails的配备的JBuilder默认情况下生成json响应。你只需要找到group/index.json.jbuilder并删除里面的created_atupdated_at。并改变你的控制器动作:

def index 
    @group = Group.all 
end 

,或者如果你需要支持其他格式:

def index 
    @group = Group.all 
    respond_to do |format| 
     format.json 
    end 
end 

你可以看到你没有指定任何的Rails会默认使用您的JBuilder文件。

你可以简单地做:

class GroupsController < ApplicationController 
    prepend SimpleCommand 
    ... 
    def index 
    render json: Group.pluck(:id, :name, :has_subgroups) 
    end 
end 

它可能无所谓你,但我觉得方法是更快,因为它不会实例所有Group对象。

+0

我想这是一个需要考虑的折衷。如果你打算为了简单和代码清晰,我不会使用这种方法,因为你正在操纵控制器内的模型数据。你怎么看? – Cyzanfar

+0

@Cyzanfar模型的作用是处理业务逻辑,而不是数据格式/序列化。串行器将是完美的地方来处理这个角色 – MrYoshiji

+0

是的,我同意理想的地方将在串行器。但绝对不是在控制器中... ... – Cyzanfar