Rails to_json (методы: => [...]) для разных ActiveRecords - PullRequest
0 голосов
/ 26 апреля 2018

В Rails у меня есть объект с именем values, который может быть одним из 20 видов ActiveRecord, и только в 1 из них есть метод (может быть неправильный термин, rails newbie), который может добавить настраиваемое поле вВозвращенный объект JSON, где method name - это field name, а method returned value - это field 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,

  ..
}

. У меня только определен type_needed в A, который в некоторых случаях будет возвращать true.Для других, таких как B, C, D ... которые в общем 19, я хочу, чтобы все они возвращали type_needed как false, есть ли способ, которым я могу сделать это в одном месте вместо добавления метода type_needed в остальных 19?

Ответы [ 2 ]

0 голосов
/ 26 апреля 2018

Если я правильно понимаю ваш вопрос, то вы хотите один раз определить метод type_needed и включить его во все свои 20 моделей.Если да, то вы можете определить проблему и включить ее во все свои 20 моделей.

приложение / модели / проблемы / my_model_concern.rb

module MyModelConcern
  extend ActiveSupport::Concern

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

app / models / a.rb

class A < ApplicationRecord
  include MyModelConcern

  def some_method
  end
end

app / models / 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

Проверьте, поможет ли это.

0 голосов
/ 26 апреля 2018

Я сделаю это следующим образом:

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}]"
...