ActiveRecord не предоставляет все столбцы базы данных - PullRequest
0 голосов
/ 31 августа 2018

Я создал миграцию, которая добавила новый столбец в одну из наших таблиц / моделей (cloud_photo_url). Однако API не выдает значение, когда я пытаюсь его отобразить ... Я также заметил, что другие также отсутствуют.

Я не мог понять, как я могу получить в выводе json значение из cloud_photo_url. Чтобы было ясно, оно сохраняется в базе данных, но по какой-то причине API не возвращает значение. Если я изменю или обновлю другие значения (например, first_name или last_name), эти изменения будут отражены в ответе json.

дб / схема:

     Column      |            Type             |                       Modifiers
-----------------+-----------------------------+-------------------------------------------------------
 id              | uuid                        | not null default shared_extensions.uuid_generate_v4()
 last_seen_at    | timestamp without time zone |
 auth_token      | character varying           |
 created_at      | timestamp without time zone | not null
 updated_at      | timestamp without time zone | not null
 first_name      | character varying           |
 last_name       | character varying           |
 email           | character varying           |
 birthday        | date                        |
 provider_id     | character varying           |
 password_digest | character varying           |
 gender          | integer                     | default 0
 verified        | boolean                     | default false
 photo           | character varying           |
 provider        | integer                     | default 0
 cloud_photo_url | character varying           |

код рубина:

@user = User.find(params[:id])
render json: @user

вывод json из конечной точки API:

{
    "user": {
        "id": "8c29a48e-c2c2-4374-b8e6-f9d7c6970a9a",
        "auth_token": "WH4fveVNa1vANgD6LKbVJPL2",
        "provider": "guest",
        "provider_id": "111959522860722",
        "first_name": "miguel",
        "last_name": "martin",
        "email": "a@b.com",
        "verified": false,
        "gender": "unknown",
        "birthday": null,
        "photo": null,
        "pois": []
    }
}

Редактировать 1:

• согласно комментариям, puts @user.to_json работает с полным содержимым БД.

• да, я уверен, что значения сохраняются в БД. Я также уверен, что маршрут правильный (как я указал в своем вопросе, если я обновлю другие отображаемые значения, они также обновятся в ответе).

• Я бы согласился, что, кажется, что-то мешает render :json, но я не могу понять, что именно. Я искал файлы .rabl, но ничего не было найдено.

• использование render inline: @user.to_json, content_type: "application/json" делает меня довольно близким ... JSON просто немного искажен (не полностью инкапсулирован) ... однако я бы предпочел исправить это "правильным образом".

Будет полезна любая дополнительная помощь по настройке того, что может повлиять на этот маршрут / рендер / модель / контроллер.

Редактировать 2:

Моя модель была запрошена, вот она:

class User < ApplicationRecord
  attr_accessor :updating_password

  mount_uploader :photo, UserPhotoUploader

  has_secure_password validations: false
  has_secure_token :auth_token

  enum gender: { unknown: 0, female: 1, male: 2 }, _prefix: true
  enum platform: { ios: 0, android: 1 }
  enum provider: { guest: 0, email: 1, facebook: 2 }, _prefix: true

  has_many :comments, dependent: :destroy
  has_many :enters, dependent: :destroy
  has_many :pois, through: :subscriptions
  has_many :subscriptions, dependent: :destroy
  has_many :devices, dependent: :destroy

  has_many :outgoing_messages, class_name: 'MessageQueue', dependent: :destroy

  has_many :user_messages, dependent: :destroy
  has_many :messages, through: :user_messages, source: :user

  validates_associated :devices

  validates :provider_id, presence: true, if: :provider_requires_id
  validates :first_name,  presence: true, unless: :provider_is_guest
  validates :last_name,   presence: true, unless: :provider_is_guest
  validates :email,
    presence: true,
    uniqueness: { case_sensitive: false },
    format: { with: REGEX_EMAIL, message: 'Invalid email address' },
    unless: :provider_is_guest
  validates :password, length: { minimum: 6, maximum: 128, message: 'must be greater than 5 characters' }, if: :setting_password?
  validates :provider_id, uniqueness: {
      scope: [:provider],
      message: 'Provider ID already exists'
  }, if: :provider_requires_id

  def gender=(g)
    g.try(:downcase!)

    gender = g.blank? ? 0 : g
    super(gender)
  end

  # IF not guest or email account then it requires a provider ID
  def provider_requires_id
    !['guest', 'email'].include?(self.provider)
  end

  def provider_is_guest
    provider_guest?
  end

  def setting_password?
    (self.provider_email? && new_record?) || updating_password
  end

  def name
    provider_guest? ? "Guest User" : "#{first_name} #{last_name}"
  end

  def send_email_verification
    UserVerificationMailer.perform_later(current_tenant, self)
  end

  def send_password_reset
    UserPasswordResetMailer.perform_later(current_tenant, self)
  end
end

1 Ответ

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

Используя active_model_serializers ,

Допустим,

@user = User.find(params[:id])
render json: @user

Это означает, что он будет непосредственно искать UserSerializer для визуализации @user объекта. атрибуты, определенные в UserSerializer, будут отображаться как выходные данные json.

Кроме этого active_model_serializers имеет несколько параметров для настройки вывода json, например: -

render json: @user, serializer: CustomUserSerializer, serializer_options: {}, status: 200

А в custom_user_serializer.rb

class CustomUserSerializer < ActiveModel::Serializer
  attributes :id,
             :last_seen_at, 
             :auth_token,
             :created_at,
             :updated_at
             :...#so on
end
...