Почему Awesome Print не работает с некоторыми объектами коллекции Rails?

Awesome Print вообще отлично работает для меня в Rails.

Но когда делаю ap Post.all в консоли Rails я получаю только стандартный полный вывод строки.

Имеет ли это отношение к возвращенным ActiveRecord_Relation класс или что-то еще, потому что, когда массив возвращается, как в ap Post.all.each {|p| p}Удивительный Принт делает свое дело.

2 ответа

Решение

Почему бы просто не преобразовать его в массив?

ap Post.all.to_a

или вы можете создать патч:

alias :old_ap :ap
def ap(object, option={})
  if object.class == ActiveRecord::Relation::ActiveRecord_Relation_Post
    old_ap object.to_a, option
  else
    old_ap object, option
  end
end


Вы правы. Возможно, это несовместимая проблема с Rails4, поскольку последний коммит на github был 6 месяцев назад. Вот проблема:

awesome_print-1.2.0/lib/awesome_print/ext/active_record.rb@24

def cast_with_active_record(object, type)
  cast = cast_without_active_record(object, type)
  return cast if !defined?(::ActiveRecord)

  if object.is_a?(::ActiveRecord::Base)
    cast = :active_record_instance
  elsif object.is_a?(Class) && object.ancestors.include?(::ActiveRecord::Base)
    cast = :active_record_class
  elsif type == :activerecord_relation #HERE the problem
    cast = :array
  end
  cast
end

метод установит приведение к массиву, когда type является :activerecord_relation

в то время как в awesome_print-1.2.0/lib/awesome_print/inspector.rb@151

def printable(object)
  case object
  when Array  then :array
  when Hash   then :hash
  when File   then :file
  when Dir    then :dir
  when Struct then :struct
  else object.class.to_s.gsub(/:+/, "_").downcase.to_sym #HERE gets the type
  end
end

Но класс объекта Relation в rails4 выглядит так:

> Post.all.class
=> ActiveRecord:: Relation:: ActiveRecord_Relation_Post

Итак, условие в cast_with_active_record получает тип "activerecord_relation_activerecord_relation_post" вместо "activerecord_relation". Тогда условие не выполняется, и приведение не выполнено.

Вот новый патч, который может работать:

module AwesomePrint
  class Inspector
    alias_method :old_printable, :printable
    private
    def printable(object)
      if object.class.to_s.downcase.include?("activerecord_relation")
        return :activerecord_relation
      end
      old_printable(object)
    end
  end
end

Что я делаю, это помещаю это в ваш ~/.pryrc

class Class
  def list_all
    self.all.each { |s| puts s }
  end
end
Другие вопросы по тегам