Могу ли я переопределить метод as_ json для всех моделей? - PullRequest
0 голосов
/ 01 февраля 2020

Я пытаюсь переопределить as_json для всех своих моделей, потому что хочу добавить логическое значение.

Модель: user.rb

def as_json
  super.merge(date: DateTime.current)
end

Модель: book.rb

def as_json
  super.merge(date: DateTime.current)
end

Затем я пытаюсь переопределить as_json соответствующий метод , но он не работает.

Могу ли я переопределить as_ json метод, общий для всех мои модели?

Ответы [ 2 ]

4 голосов
/ 01 февраля 2020

Да. Переопределите это в вашем ApplicationRecord. Все модели должны иметь подкласс ApplicationRecord, а не ActiveRecord::Base.

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

class ApplicationRecord < ActiveRecord::Base
  self.abstract_class = true

  def as_json
    super.merge("date" => DateTime.current) { |key, oldval, newval|
      raise "#{self} has existing #{key} => #{oldval.inspect}"
    }
  end
end

class Book < ApplicationRecord
  ...
end

class User < ApplicationRecord
  ...
end
1 голос
/ 01 февраля 2020

Да, ответ @schwern идеально подходит для версий Rails> = 5.

Еще один способ сделать это - переместить ваш метод в модуль и включить этот модуль во все необходимые модели.

Это работает и с более старыми версиями Rails и дает гибкость выбора, включая вашу функцию.

require 'active_support/concern'
module MyModule
  extend ActiveSupport::Concern

  def as_json
    super.merge(date: DateTime.current)
  end

  class_methods do
    ...
  end
end

class Book < ApplicationRecord
  include MyModule
  ...
end

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