Протестировано с Rails 5.2.2, это источник as_json
:
def as_json(options = nil) #:nodoc:
if respond_to?(:to_hash)
to_hash.as_json(options)
else
instance_values.as_json(options)
end
end
Это означает, что если вы реализуете метод to_hash
в своем классе, ваш вызов as_json
будет работатьтак, как вы хотите:
class Tax
attr_reader :guest_age
def initialize(guest_age)
@guest_age = guest_age
end
def amount
0
end
def to_hash
instance_values.merge(amount: amount)
end
end
И ...
Tax.new(1).as_json
# => {"guest_age"=>1, "amount"=>0}
Это будет включать в себя amount
всегда, хотя, кажется, не существует простого способа обойти это.
Это может работать по-другому, однако вам нужно явно выбросить amount
:
Tax.new(1).as_json(except: :amount)
# => {"guest_age"=>1}
или явно указать атрибуты, которые вы хотите сериализовать:
Tax.new(1).as_json(only: "guest_age")
# => {"guest_age"=>1}
Опция methods
, которую вы хотите использовать, похоже, строго привязана к ActiveRecord.