Удаление пустых хэшей {} из массива в сериализированном объекте Active Model - PullRequest
0 голосов
/ 04 сентября 2018

У меня есть несколько условий, когда я не хочу сериализовать текущий объект и хочу пропустить его. Но я не нашел способа сделать это, поэтому я игнорирую атрибуты attribute: foo, if:: condition. И это генерирует пустой {} в моем сериализованном объекте внутри массивов. Как мне это исправить?

[
 {
  "id": 392027,
  "name": "ISC Board",
  "grades":[
            {
                "id": 333938,
                "name": "1",
                "subjects": [
                    {
                        "id": 571671,
                        "subject": "Math"
                    },
                    {
                        "id": 742980,
                        "subject": "Science"
                    },
                    {
                        "id": 186926,
                        "subject": "English"
                    },
                    {
                        "id": 658224,
                        "subject": "Social_Studies"
                    },
                    {},
                    {},
                    {}
                ]
            },
            {
                "id": 333943,
                "name": "2",
                "subjects": [
                    {
                        "id": 571671,
                        "subject": "Math"
                    },
                    {
                        "id": 742980,
                        "subject": "Science"
                    },
                    {
                        "id": 186926,
                        "subject": "English"
                    },
                    {
                        "id": 658224,
                        "subject": "Social_Studies"
                    },
                    {},
                    {},
                    {}
                ]
            },
          ]
 },
 {
  "id": 666627,
  "name": "NY Board",
  "grades":[
            {
                "id": 333938,
                "name": "1",
                "subjects": [
                    {
                        "id": 571671,
                        "subject": "Math"
                    },
                    {
                        "id": 742980,
                        "subject": "Science"
                    },
                    {
                        "id": 186926,
                        "subject": "English"
                    },
                    {
                        "id": 658224,
                        "subject": "Social_Studies"
                    },
                    {},
                    {},
                    {}
                ]
            },
            {
                "id": 432943,
                "name": "2",
                "subjects": [
                    {
                        "id": 571671,
                        "subject": "Math"
                    },
                    {
                        "id": 742980,
                        "subject": "Science"
                    },
                    {
                        "id": 186926,
                        "subject": "English"
                    },
                    {
                        "id": 658224,
                        "subject": "Social_Studies"
                    },
                    {},
                    {},
                    {}
                ]
            },
          ]
  }


]

сериализатор выглядит примерно так-

class BoardSerializer < ActiveModel::Serializer
  #some code
  class GradeSerializer < ActiveModel::Serializer 
     has_many :subjects
     #some code
     class SubjectSerializer < ActiveModel::Serializer
        attribute :id, if: :condition
        attribute :name, key: :subject, if: :condition

        def condition
            #some code
            #returns true or false
            #will not return both :id and :subject if false- I want to 
            #skip this current object if condition fails. (returns {})
        end  
     end

   end
end

Как мне просто пропустить текущий объект в сериализаторе или удалить пустые хэши? Спасибо

Ответы [ 2 ]

0 голосов
/ 04 сентября 2018

Пожалуйста, проверьте, если это ожидаемый результат:

input.transform_values { |v| v.map {|e| e.transform_values { |vv| vv.class == Array ? vv.select { |ee| ee unless ee.empty? } : vv } } }

# => {:grades=>[{:id=>333938, :name=>"1", :subjects=>[{:id=>571671, :subject=>"Math"}, {:id=>742980, :subject=>"Science"}, {:id=>186926, :subject=>"English"}, {:id=>658224, :subject=>"Social_Studies"}]}]}


РЕДАКТИРОВАТЬ: для удовлетворения изменений в вопросе OP.
input.map { |e| e.transform_values { |v| v.is_a?(Array) ? v.map {|ee| ee.transform_values { |vv| vv.is_a?(Array) ? vv.select { |eee| eee unless eee.empty? } : vv } } : v } }

# => [{:id=>392027, :name=>"ISC Board", :grades=>[{:id=>333938, :name=>"1", :subjects=>[{:id=>571671, :subject=>"Math"}, {:id=>742980, :subject=>"Science"}, {:id=>186926, :subject=>"English"}, {:id=>658224, :subject=>"Social_Studies"}]}, {:id=>333943, :name=>"2", :subjects=>[{:id=>571671, :subject=>"Math"}, {:id=>742980, :subject=>"Science"}, {:id=>186926, :subject=>"English"}, {:id=>658224, :subject=>"Social_Studies"}]}]}, {:id=>666627, :name=>"NY Board", :grades=>[{:id=>333938, :name=>"1", :subjects=>[{:id=>571671, :subject=>"Math"}, {:id=>742980, :subject=>"Science"}, {:id=>186926, :subject=>"English"}, {:id=>658224, :subject=>"Social_Studies"}]}, {:id=>432943, :name=>"2", :subjects=>[{:id=>571671, :subject=>"Math"}, {:id=>742980, :subject=>"Science"}, {:id=>186926, :subject=>"English"}, {:id=>658224, :subject=>"Social_Studies"}]}]}]
0 голосов
/ 04 сентября 2018

Вы можете использовать #select! для этого вопроса:

input = {
  "grades":
       [
         {
           "id": 333938,
          "name": "1",
          "subjects":
            [
              {
                "id": 571671,
               "subject": "Math"
              },
              {
                "id": 742980,
               "subject": "Science"
              },
              {
                "id": 186926,
               "subject": "English"
              },
              {
                "id": 658224,
               "subject": "Social_Studies"
              },
              {},
              {},
              {}
            ]
         }
       ]
}

input[:grades].first[:subjects].select! { |i| !i.empty? }
...