Как подтверждено выше, это проблема с базой Rails. Патч для рельсов здесь еще не применен и кажется, по крайней мере, немного спорным, поэтому я не решаюсь применять его локально. Даже если применить его как патч обезьяны, он может потенциально усложнить будущие обновления рельсов.
Я все еще рассматриваю RABL , предложенный выше, это выглядит полезным. На данный момент я бы не хотел добавлять другой язык шаблонов представления в свое приложение. Мои текущие потребности очень малы.
Итак, вот обходной путь, который не требует патча и работает для большинства простых случаев. Это работает, когда as_json
метод ассоциации, который вы хотели бы вызвать, выглядит как
def as_json(options={})
super( <... custom options ...> )
end
В моем случае у меня есть Schedule
модель, в которой много Events
class Event < ActiveRecord::Base
# define json options as constant, or you could return them from a method
EVENT_JSON_OPTS = { :include => { :locations => { :only => [:id], :methods => [:name] } } }
def as_json(options={})
super(EVENT_JSON_OPTS)
end
end
class Schedule < ActiveRecord::Base
has_many :events
def as_json(options={})
super(:include => { :events => { Event::EVENT_JSON_OPTS } })
end
end
Если вы следуете руководству, что в любое время :include
ассоциация в ваших as_json()
методах вы определяете любые опции, которые вам нужны, в качестве константы в модели, на которую ссылаются, это будет работать для произвольных уровней ассоциаций. ПРИМЕЧАНИЕ Мне нужен был только первый уровень ассоциации, настроенный в приведенном выше примере.