переопределение as_json для as_json (: includes =>: ассоциация) - PullRequest
1 голос
/ 06 октября 2011

У меня есть два класса, Foo и Bar.Foo has_many Бары.Bar на самом деле является суперклассом нескольких классов, совместно использующих таблицу STI.

Я хочу сделать дамп моих записей Foo, включая связанные с ними Bars.Для этого я звоню

Foo.all.to_json(:incude => :bars)

Первоначальная проблема заключается в том, что я хочу различать различные виды классов Bar.Rails делает это различие через столбец типа в таблице Bar, но этот столбец не включен в сериализацию записей Ber в json.

Итак, я переопределил to_json в классе Bar, чтобы включить атрибут type.когда я вызываю to_json для экземпляра Bar, я получаю новые результаты, но когда я вызываю to_json для Foo и включаю его Bars, я получаю старый to_json (т.е. без включенного атрибута type).

I 'С тех пор я разочаровался в этом и собираюсь использовать другой подход, но мне все еще интересно, что здесь происходит.Может быть, я должен использовать as_json вместо to_json?Я до сих пор не понимаю разницу между этими двумя методами.

1 Ответ

0 голосов
/ 06 октября 2011

Я не могу повторить это. В моем тестовом классе он ведет себя правильно.

Давайте назовем класс # 1 Foo, а Foo включен в качестве аргумента для Bar. В Bar.to_json (foo) добавьте это:

foo.class.ancestors.each do |c|
  has_json = c.instance_methods.include?(:to_json)
  p "#{c} has to_json: #{has_json}"
  if has_json
    p "Owner: #{c.instance_method(:to_json).owner}"
  end
end

Это может пролить некоторый свет на иерархию вызовов, а также на то, получает ли переменная вашего экземпляра to_json из нужного класса.

...