Rails to_json(方法:=> [...])用于不同的ActiveRecords

时间:2018-04-26 05:54:25

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

在Rails中,我有一个名为values的对象,可能是20种ActiveRecord中的一种,只有其中一种有一种方法(可能是错误的术语,rails newbie)可以添加一个定制的返回的JSON对象中的字段method namefield namemethod returned valuefield value。例如

class XXXController < ApplicationController

  ..

  if a
    values = A
  elsif b
    values = B
  elseif c
    values = C
    ..
  end

  render :json => values.to_json(:methods => :type_needed)

你会看到像

这样的回应
{
  ..

  "type_needed": true,

  ..
}

我只在A中定义了type_needed,在某些情况下会返回true。对于其他像B,C,D ......总共19个,我希望他们都将type_needed返回为false,有没有办法可以在一个地方做到这一点,而不是在其余地方添加type_needed方法19?

2 个答案:

答案 0 :(得分:1)

我将按如下方式进行:

json = values.to_json(:methods => :type_needed)
# => "[{\"id\":1,\"name\":\"Aaa\"},{\"id\":\"2\",\"name\":\"Bbb\"}]"   # => Representational value only

ary = JSON.parse(json)
# => [{"id"=>1, "name"=>"Aaa"}, {"id"=>2, "name"=>"Bbb"}]

ary.map! { |hash| hash[:type_needed] = false unless hash.key?(:type_needed); hash }
# => [{"id"=>1, "name"=>"Aaa", :type_needed=>false}, {"id"=>2, "name"=>"Bbb", :type_needed=>false}]

ary.to_json
# => "[{\"id\":1,\"name\":\"Aaa\",\"type_needed\":false},{\"id\":\"2\",\"name\":\"Bbb\",\"type_needed\":false}]"

答案 1 :(得分:0)

如果我正确理解您的问题,那么您需要定义一次type_needed方法,并将其包含在所有20个模型中。如果是,那么您可以定义一个问题并将其包含在所有20个模型中。

应用/模型/关切/ my_model_concern.rb

module MyModelConcern
  extend ActiveSupport::Concern

  def type_needed?
    self.respond_to?(:some_method)
  end
end

应用/模型/ a.rb

class A < ApplicationRecord
  include MyModelConcern

  def some_method
  end
end

应用/模型/ b.rb

class B < ApplicationRecord
  include MyModelConcern


end

应用/模型/ c.rb

class C < ApplicationRecord
  include MyModelConcern


end

用上面的

a = A.new
a.type_needed? 
=> true

b = B.new
b.type_needed? 
=> false

c = C.new
c.type_needed? 
=> false

看看这是否有帮助。