Почему 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