Rails-контроллер рендеринга JSON. Мне нужно включить ноль значений - PullRequest
1 голос
/ 22 октября 2019

В моих рельсах есть следующие модели приложений.

  • Аренда
  • Недвижимость
  • Контакт
  • Адрес
class Lease < ApplicationRecord
  belongs_to :estate
  belongs_to :contact
end

class Contact < ApplicationRecord
  has_one :address
end
      lease.as_json(include: [:estate, {contact: {:include => :address}} ])

И это сгенерированный json, когда contact.address не равен нулю:

{
id: 1,
start_date: "2019-05-09",
end_date: "2019-05-09",
title: "test title",
description: "test desc",
estate_id: 10,
contact_id: 4,
estate: {
    id: 10,
    address: "Address here",
    lat: 37.0322021,
    lng: 22.11332570000002,
},
contact: {
    id: 1,
    full_name: "contact name goes here",
    address: {
          title: 'this is the address'
       }
    }
}

Мне нужно не скрывать поле адресаиз json всякий раз, когда он равен нулю (это процесс по умолчанию).

Другими словами, когда contact.address равен нулю, мне нужен следующий результат json:

{
    id: 1,
    start_date: "2019-05-09",
    end_date: "2019-05-09",
    title: "test title",
    description: "test desc",
    estate_id: 10,
    contact_id: 4,
    estate: {
        id: 10,
        address: "Address here",
        lat: 37.0322021,
        lng: 22.11332570000002,
    },
    contact: {
        id: 1,
        full_name: "contact name goes here",
        address: {
              title: ''
           }
        }
    }

Уведомлениечто мне нужно поле адреса, чтобы быть там, но без значения.

1 Ответ

0 голосов
/ 22 октября 2019

Это на самом деле не nil значение, как стандартный атрибут. Свяжитесь с адресом has_one, поэтому в базе данных должна быть запись, или экземпляр должен быть присоединен к непрошеному объекту (ниже), если вы собираетесь использовать as_json.

У меня есть две идеи о том, какподойти к этому, но сначала я немного удивлен этой частью ваших данных:

contact: {
    id: 1,
    full_name: "contact name goes here",
    address: {
          title: 'this is the address'
       }
    }
}

Я не уверен, что это в корне вашей проблемы, но вы уверены, что не сделаликод руки это? Я ожидаю, что будет присутствовать address.id:

contact: {
    id: 1,
    full_name: "contact name goes here",
    address: {
         id: 1,
         title: 'this is the address'
       }
    }
}

Мое Первое предложение будет примерно таким:

lease.contact.address = Address.new unless lease.contact.address

Это, вероятно, получит то, что вы хотите,но я не проверял его.

Мое Второе предложение было бы рассмотреть возможность использования формального сериализатора для получения еще одного уровня логики и обработки между записями вашей активной модели и вашим JSON. Вы можете определить «атрибуты», которые вычисляются в методах.

У меня были хорошие результаты с fast_jsonapi

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...