Активная запись to_json \ as_json в массиве моделей - PullRequest
2 голосов
/ 22 октября 2010

Во-первых, я не использую Rails.Я использую Синатру для этого проекта с Active Record.

Я хочу иметь возможность переопределить либо to_json, либо as_json в моем классе Model, чтобы он определял некоторые параметры по умолчанию.Например, у меня есть следующее:

class Vendor < ActiveRecord::Base
  def to_json(options = {})
    if options.empty?
      super :only => [:id, :name]
    else
      super options
    end
  end
end

где Vendor имеет больше атрибутов, чем просто идентификатор и имя.В моем маршруте у меня есть что-то вроде следующего:

@vendors = Vendor.where({})
@vendors.to_json

Здесь @vendors - это объекты вендора Array (очевидно).Однако возвращенный json не вызывает мой метод to_json и возвращает все атрибуты моделей.

У меня нет возможности изменить маршрут, потому что я на самом деле использую модифицированный камень sinatra-rest (http://github.com/mikeycgto/sinatra-rest).

Любые идеи о том, как достичь этой функциональности? Я мог бысделай что-то вроде следующего в моем драгоценном камне sinatra-rest, но это кажется глупым:

@PLURAL.collect! { |obj| obj.to_json }

Ответы [ 2 ]

5 голосов
/ 22 октября 2010

Попробуйте переопределить serializable_hash intead:

def serializable_hash(options = nil)
  { :id => id, :name => name }
end

Подробнее здесь .

4 голосов
/ 14 февраля 2013

Если вы переопределяете as_json вместо to_json, каждый элемент в массиве будет отформатирован как as_json перед преобразованием массива в JSON

Я использую следующее, чтобы отображать только доступные атрибуты:

def as_json(options = {})
    options[:only] ||= self.class.accessible_attributes.to_a
    super(options)
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...