rails:如何从JSON响应中的对象数组中省略特定属性?

时间:2016-07-04 16:14:31

标签: ruby-on-rails ruby rails-activerecord

我一直在试图获得一个不包含id column的模型。我认为方法select允许这样做,但是当我访问模型时,我会看到id字段的值为nil

当我使用时:

module API
  class MyController < ActionController::API
    def index
      response = MyModel
                 .where("value > ?", 0)
                 .select('code','value')
      render json: response, status: 200
    end

当我使用这样的结果检查结果时

为MyModel     .where(&#34;值&gt;?&#34;,0)     。选择(&#39;代码&#39;&#39;值&#39;)     。每个{| M |把m}

我明白了

<MyModel id: nil, code: "110", value: 100>
<MyModel id: nil, code: "111", value: 100>
<MyModel id: nil, code: "112", value: 100>

在我的回答中我得到了这个:

[{id: null, code: "110", value: 100},{id: null, code: "111", value: 100},{id: null, code: "112", value: 100}]

如何省略id列?

2 个答案:

答案 0 :(得分:0)

我相信它是puts命令的一部分。如果你只做Model.select(:attributes),它不应该返回id列,如果它不在列表中(在这里做了测试并且工作正常)。我相信puts命令从数据库或类似的东西中检索对象。顺便说一下,如果覆盖对象类中的puts object方法,则可以覆盖执行to_s时打印的内容

答案 1 :(得分:0)

在Rails中,当使用#select方法时,即使您没有在id方法参数中使用select,它也会显示它,因为在Rails中默认主键是{{1 }}。如果您将主键覆盖到其他内容,则会显示该列。看看例子:

id

这是因为在我的优惠券模型中,我将主键设置为Coupon.select(:active) # Coupon Load (0.6ms) SELECT "coupons"."active" FROM "coupons" # => #<ActiveRecord::Relation [#<Coupon active: true, code: nil>, #<Coupon active: true, code: nil>...

code

虽然它出现在 inspect 结果中,但它确实存在,直到你真正拿到它。现在,如果您设置class Coupon < ActiveRecord::Base self.primary_key = 'code' # .. end 进行测试,您会看到self.primary_key = ''没有显示任何内容。但是请不要像我一样将#select设置为primary_key,以便从''结果中移除id显示。我只想表明它来自哪里,没有别的。

select