Визуальный сахар для ActiveRecord

    Каждый, кто разрабатывал приложение на RoR знает, что в консоли (./script/console) не слишком удобно просматривать ActiveRecord объекты, они имеют мягко говоря не читабельный вид

    Например в моем последнем проекте есть модель Schema

    # == Schema Information<br>
    #<br>
    # Table name: schemas<br>
    #<br>
    #  id                  :integer         not null, primary key<br>
    #  user_id             :integer         not null<br>
    #  name                :string(255)     not null<br>
    #  public              :boolean         not null<br>
    #  description         :string(255)<br>
    #  schema_file_name    :string(255)<br>
    #  schema_content_type :string(255)<br>
    #  schema_file_size    :integer<br>
    #  schema_updated_at   :datetime<br>
    #  created_at          :datetime<br>
    #  updated_at          :datetime<br>
    #<br>
    <br>


    Соответсвенно, когда я в консоли выполняю поиск по объектам, то в ответ получаю «кашу»:

    >> Schema.find(:all, :limit => 3)
    => [#<Schema id: 5, user_id: 14, name: "1", public: true, description: "1", schema_file_name: "1.kml", schema_content_type: "text/xml", schema_file_size: 177411, schema_updated_at: "2009-08-19 23:46:19", created_at: "2009-08-19 23:46:19", updated_at: "2009-08-19 23:46:19">, #<Schema id: 6, user_id: 14, name: "2", public: true, description: "2", schema_file_name: "2.kml", schema_content_type: "text/xml", schema_file_size: 3084, schema_updated_at: "2009-08-19 23:46:56", created_at: "2009-08-19 23:46:56", updated_at: "2009-08-19 23:46:56">, #<Schema id: 8, user_id: 14, name: "а", public: true, description: "", schema_file_name: "_.kml", schema_content_type: "text/xml", schema_file_size: 1461, schema_updated_at: "2009-08-19 23:47:53", created_at: "2009-08-19 23:47:53", updated_at: "2009-08-19 23:47:53">]



    Можно конечно сделать
    >> pp Schema.find(:all, :limit => 3)
    [#<Schema id: 5, user_id: 14, name: "1", public: true, description: "1", schema_file_name: "1.kml", schema_content_type: "text/xml", schema_file_size: 177411, schema_updated_at: "2009-08-19 23:46:19", created_at: "2009-08-19 23:46:19", updated_at: "2009-08-19 23:46:19">,
    #<Schema id: 6, user_id: 14, name: "2", public: true, description: "2", schema_file_name: "2.kml", schema_content_type: "text/xml", schema_file_size: 3084, schema_updated_at: "2009-08-19 23:46:56", created_at: "2009-08-19 23:46:56", updated_at: "2009-08-19 23:46:56">,
    #<Schema id: 8, user_id: 14, name: "а", public: true, description: "", schema_file_name: "_.kml", schema_content_type: "text/xml", schema_file_size: 1461, schema_updated_at: "2009-08-19 23:47:53", created_at: "2009-08-19 23:47:53", updated_at: "2009-08-19 23:47:53">]



    или же преобразовать в YAML:
    >> puts Schema.find(:all, :limit => 3).to_yaml<br>
    --- <br>
    - !ruby/object:Schema <br>
      attributes: <br>
        name: "1"<br>
        updated_at: 2009-08-19 23:46:19.606916<br>
        public: t<br>
        schema_updated_at: 2009-08-19 23:46:19.603984<br>
        id: "5"<br>
        description: "1"<br>
        schema_content_type: text/xml<br>
        user_id: "14"<br>
        schema_file_name: 1.kml<br>
        created_at: 2009-08-19 23:46:19.606916<br>
        schema_file_size: "177411"<br>
      attributes_cache: {}<br>
    .....

    признаться — меня и это не особо возбуждает…
    Но на днях я подсмотрел у Ryan'а на Railscasts, обалденное отображение табличек:

    image

    потратив пару часов на поиск, я нашел gem который отображает массивы объектов как таблицы.
    Им оказался Hirb.
    устанавливается он стандартно:
    sudo gem install hirb

    Активируется через:
    $ ./script/console
    Loading development environment (Rails 2.3.5)
    irb>> require 'hirb'
    => true
    irb>> Hirb.enable
    => nil


    Согласитесь, выглядит гораздо приятней:

    image

    а для того, чтобы сделать это отображение по умолчанию, добавляем в ~/.irbrc
    if ENV['RAILS_ENV']<br>
      require 'rubygems'<br>
      begin<br>
        require 'hirb'<br>
        Hirb.enable<br>
      rescue LoadError<br>
        puts "Error loading Hirb. Run 'sudo gem install hirb'"<br>
      end<br>
    end<br>


    отключить можем в любой момент, набрав
    >> Hirb.disable



    при больших объемах данных вывод передается в $PAGER, что согласитесь тоже удобно
    Поделиться публикацией
    AdBlock похитил этот баннер, но баннеры не зубы — отрастут

    Подробнее
    Реклама

    Комментарии 33

    • НЛО прилетело и опубликовало эту надпись здесь
        0
        Классно, спасибо! Вопрос — а что такое $PAGER?
          +1
          переменная окружения, в которой содержится имя программы ответственной за просмотр текста, практически во всех современных дистрибутивах это less
          –4
          def to_s; id+name; end
          или pp чем-то другим не устроил?
            –4
            Вот и в Ruby пришел Delphi-style: «где бы взять компонент, который делает то, что мне надо».
              +2
              Изначально так и было задумано! =)
                0
                Когда вы цените своё время, думаю, это очень здорово. Я перешел с РНР на Ruby, и доволен гибкими возможностями, и скоростью разработки. (:
                  0
                  Так я даже не давал оценку, здорово это или нет :) меня тоже раздражают велосипеды и NIH-синдром
              • НЛО прилетело и опубликовало эту надпись здесь
                0
                Спасибо. До этого обходился только wirble. Вместе их заставить работать пока не смог. Оба перегружают дефолтные параметры вывода irb. Но думаю эта штука круче простой раскраски…
                  0
                  у меня и то и другое работает
                    +1
                    А покажи .irbc, если не сложно…
                      0
                      Вот рабочий вариант, заранее прошу прощения, что без подсветки:

                      require 'rubygems'

                      begin
                      require 'wirble'
                      Wirble.init
                      Wirble.colorize
                      rescue LoadError => err
                      warn «Couldn't load Wirble: #{err}»
                      end

                      if ENV['RAILS_ENV']
                      begin
                      require 'hirb'
                      Hirb.enable
                      rescue LoadError
                      puts «Error loading Hirb. Run 'sudo gem install hirb'»
                      end
                      end
                    –1
                    Интересно, спасибо!
                    хотелось бы увидеть примеры рабочего кода с relationship'ами типа has_many, :through и им подобными many-to-many. Сейчас как раз ковыряюсь с этим.
                    не получается сделать join модель, не получается правильно создавать объекты. И примеров кода нет в интернете. Можете что-то посоветовать?
                      0
                      это у AR то нет примеров кода? гг, у ни одно ОРМ-либы в мире нет большего количества примеров ) начать можно с railsapi.com и guides.rubyonrails.org

                      По топику. Фишка hirb еще в том, что он не только для ActiveRecord объектов. Вы можете задавать view для любых объектов, в том числе и присущих конкретному проекту, если приходится с ними часто работать из консоли.
                        0
                        Можете кинуть линк на работающий экзампл по hmt?
                        • НЛО прилетело и опубликовало эту надпись здесь
                            0
                            в 5 пяти ссылках ни одной строчки кода из контроллеров или views
                            • НЛО прилетело и опубликовало эту надпись здесь
                                0
                                опять таки из моего проекта 2 строчки

                                  has_many :user_models, :class_name => 'UserModel'
                                  has_many :models, :through => :user_models, :order => "show_order"
                                


                                в гугле такого добра навалом
                                  0
                                  эээ… а при чем тут ассоциации и контроллеры с представлениями?
                                0
                                даже если допустить, что в документации что-то непонятно, то что не работает из этого примера guides.rubyonrails.org/association_basics.html#the-has-many-through-association?

                                Сложности начинаются со всякими штуками связаными, скажем, с has_many, :through с полиморфами или через другие has_many, :through, но по базовым штукам куча текстов / примеров, включая книги (типа The Rails Way, может в последнее время и получше что появилось).
                                  0
                                  я читал этот гайд. Всё отлично описано, но нет примера кода из контроллеров и views. модели я создал и связал. Проблема в остальном «окружении».
                                  Для пример, вот пасти pastie.org/750159

                                  Я прекрасно отображаю плейлист с треками и сортировкой по startmin(висит в playlist_track модели). Однако, у меня проблемы с созданием треков в плейлисте с определённым startmin. В настоящий момент, я просто в базе создал нужные записи. Но как их создать с помощью рельсов, я не знаю. И доков не нашёл. Вот почему я спрашиваю рабочий пример полного кода
                                    0
                                    Ну да, про контроллеры и вьюшки в соседних гайдах.

                                    Что касается непосредственно has_many, :through, то чудес не бывает, это html и http, рисуйте формочку с чекбоксами или всякие умные js / ajax. Рельсы вам конечно помогут, смотреть form_for, fields_for и nested attributes.
                            +1
                            You're awesome!
                              0
                              Оно и вертикальные таблицы умеет делать!

                              >> Project.last
                              **************************** 1. row ****************************
                              id: 82
                              user_id: 29
                              product_id: 11
                              created_at: Fri Nov 27 17:30:23 +0200 2009
                              updated_at: Mon Dec 14 15:02:24 +0200 2009
                              1 row in set
                              • НЛО прилетело и опубликовало эту надпись здесь
                                +2
                                Для настройки вывода полей объектов моделей можно в файле RAILS_ROOT/config/hirb.yml указать небходимые для вывода поля. Пример конфига:
                                :output:
                                DigitalResource:
                                :options:
                                :fields:
                                — id
                                — name
                                — description
                                — type_of
                                — user_id
                                — publication_id
                                Author:
                                :options:
                                :fields:
                                — id
                                — name
                                — link
                                — info
                                Publication:
                                :options:
                                :fields:
                                — id
                                — name
                                — description
                                — author_id

                                *отступы необходимо поставить правильно.

                                Будем получать только указанные в конфиге поля в нужном порядке.
                                >> Author.all
                                +----+---------------------------------------------------------------------------------------------------+------+------+
                                | id | name | link | info |
                                +----+---------------------------------------------------------------------------------------------------+------+------+
                                | 2 | ЗАО «Просвещение-МЕДИА», ЗАО «Новый диск» | | |
                                | 7 | Иванов Иван Иванович | | |
                                | 6 | КГУ, А.И. Фишман, А.И. Скворцов, Р.В. Даминов | | |
                                | 4 | ООО «Дрофа», ЗАО «1С» | | |
                                | 5 | ООО «Кирилл и Мефодий» | | |
                                | 1 | ООО «Физикон» | | |
                                +----+---------------------------------------------------------------------------------------------------+------+------+
                                6 rows in set
                                  0
                                  Зачот. Заюзал.
                                    0
                                    в тему object.to_yaml — у него есть shortcut:
                                    y object
                                      +1
                                      Hirb — крут:)
                                      Автор, большое спасибо.
                                      Вы не представляете как я мучался…

                                      Только полноправные пользователи могут оставлять комментарии. Войдите, пожалуйста.

                                      Самое читаемое