为什么Awesome Print不能在某些Rails集合对象上工作?

时间:2014-04-25 10:06:29

标签: ruby-on-rails ruby-on-rails-4 rails-console awesomeprint

令人敬畏的打印通常在Rails中完美适用于我。

但是当在Rails控制台中执行ap Post.all时,我只获得标准的全行输出。

与返回的ActiveRecord_Relation类或其他内容有关,因为当返回一个数组时,就像在ap Post.all.each {|p| p}中一样,Awesome Print会完成它的工作。

2 个答案:

答案 0 :(得分:6)

为什么不将它转换为数组?

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

但是rails4中的Relation对象类就像:

  

&GT; Post.all.class
  =&GT; ActiveRecord的::关系:: ActiveRecord_Relation_Post

因此cast_with_active_record中的条件得到一个类型&#34; activerecord_relation_activerecord_relation_post&#34;而不是&#34; activerecord_relation&#34;。然后条件失败,没有完成演员。

这是一个可能有用的新补丁:

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

答案 1 :(得分:0)

我正在做的是将其放在~/.pryrc

class Class
  def list_all
    self.all.each { |s| puts s }
  end
end