• Какие имена файлов модулей и классов использовать в Rails?

    @vsuhachev
    Вы правы это такое соглашение в рельсах, автолоадинг.

    Например когда вы ссылаетесь на класс MyModule::MyClass то рельсы ищут my_module/my_class.rb во всех папках, указанных в config.autoload_paths и если файл найден то делают require.

    По умолчанию в autoload_paths уже находятся все подкаталоги каталога app, то-есть в вашем случае config/application.rb править не нужно
    Ответ написан
    Комментировать
  • Как организовать трекер выполнения ежедневно повторяющихся задач (например, бег в течение 20 дней, ложиться спать до полуночи и тд)?

    @vsuhachev
    Не знаю причем здесь рельсы, я бы сделал так:

    1) Имеем варианты описания периодичности, например:
    - раз в N часов, начиная с такого то таймштампа
    - вручную указываем периоды в виде их списка с датами начала и конца
    - еще как-то

    2) Имеем цели с привязкой к типам периодичности из пп1

    3) Храним отметки о выполнении с привязкой к цели.

    4) Для каждого типа периодичности из пп1 имеем алгоритм, который зная как задана периодичность для данного типа и используя отметки выполнения может вычислить какие периоды были пропущены, а какие нет.
    Ответ написан
    Комментировать
  • Почему с ActiveRecord не получается работать как с массивом?

    @vsuhachev
    Проблема в том, что блок в методе inject должен возвращать новое значение для первого параметра, то есть в вашем случае тот же экземпляр Hash, в который вы пишите результат

    Вот вариант с inject, который должен заработать

    gon.select_options = Product.all.to_a.inject({}) do |hash, product|
          hash[product.id] = product.materials.to_a.inject({}) do |materials_hash, material|
                materials_hash[material.id] = get_material_data_hash(material)
                materials_hash
          end
          hash
    end


    Или используйте each_with_object вместо inject
    Ответ написан
    1 комментарий
  • Как правильно сделать выборку данных?

    @vsuhachev
    У вас проблемы с логикой, должно быть как-то так
    def post_all
      @posts = Post.all
      @posts = @posts.where(status: params[:status]) if params[:status].present?
      @posts = @posts.where(city_id: params[:city_id]) if params[:city_id].present?
      @posts = @posts.paginate(page: params[:page])
    end


    И видимо еще проблема с именем параметра. Проверьте ваш код, указав в адресной строке браузера ?city_id=111. Поглядите development.log, убедитесь что имя параметра запроса именно city_id, а не posts[city_id].
    Ответ написан
    Комментировать
  • Почему Rails gem activerecord-import не сохраняет записи в БД?

    @vsuhachev
    Видимо рельсы смотрят в правильную БД, а вы нет. Изучите файл config/databases.yml, возможно там есть разгадка
    Ответ написан
  • Можно ли найти ОС для роутера на 8Мб?

    @vsuhachev
    Ну я думаю линукс можно поставить так, чтобы загрузчик находился на вашей IDE-Flash, а сама ОС на обычной USB флэшке.

    PS: cам не пробовал, конкретику не подскажу
    PPS: вот что нагуглилось www.plop.at/en/bootmanager/intro.html
    Ответ написан
  • Как эффективно изолировать от влаги компьютер на открытом балконе?

    @vsuhachev
    Если комп не жалко - залейте все силиконовым герметиком
    Ответ написан
    Комментировать
  • Как работает интерпретатор Ruby ?

    @vsuhachev
    Это определено синтаксисом ruby и не изменяемо.

    Если подробнее, то сначала происходит парсинг исходного текста в промежуточное представление кода. После чего перестают существовать отдельные символы '[' и ']', код становится древовидной структурой в памяти, которая уже хранит в узлах целые операторы. И соответственно вы переопределением оператора :[] реально просто перетасовываете указатели в этой структуре, которая ничего не знает о синтаксисе входного языка (в нашем случае ruby)
    Ответ написан
    Комментировать
  • Что такие Си с классами?

    @vsuhachev
    Так называют код, который пишут Сишники на С++, не осознавшие всяких там высоких материй вроде ООП, правил Лисковой, паттернов-шматтернов и прочей ненужной ерунды :)

    То есть в общем вы правы.
    Ответ написан
    Комментировать
  • Как работает этот пример из учебника?

    @vsuhachev
    Ваш пример на ruby 2.1.2 заработал после небольшой доработки

    1. Почему внутри метода memoize lambda получает массив?

    Непонятно что вы имели ввиду? В memoize происходит следующее:
    - создается переменная cache
    - создается объект-функция, которая является оберткой для того объекта-функции на котором вызван метод memoize. При этом внутри обертки доступна переменная cache (замыкание)
    - возвращается созданная обертка

    2. В строке cache[args] = self[*args] self - это lambda {|x| return 1 if x==0; x*factorial[x-1]}?

    Да, self это то над чем делается обертка, причем [] примененные к объекту-функции это аналог call. То есть вызов обертки с параметрами *args

    3. Зачем в self[*args] стоит оператор-звездочка (распаковка массива)?

    Для распаковки массива (как это ни странно). То есть args это массив содержащий переданные параметры, а оборачиваемая лямбда принимает число. Соответственно массив нужно распаковать.

    Рабочий код, можете повтыкать принты и поглядеть что чему равно

    class Proc #!!!!!!
      def memoize
        cache = {} # Пустой кэш. lambda захватывает его в свое замкнутое
                        # пространство
        lambda { |*args| #!!!!!
          # Заметьте, что ключ хэша - это сплошной массив аргументов!
          unless cache.has_key?(args) # если результата для этих аргументов в кэше нет,  
            cache[args] = self[*args] 
          end
          cache[args]
        }
      end
    end
    # далее демонстрируется его использование
    factorial = lambda {|x| return 1 if x==0; x*factorial[x-1]}.memoize
    
    puts factorial.call(5)
    Ответ написан
    1 комментарий
  • Стоит ли сегодня переплачивать за сайт на ruby? Или сэкономить на php?

    @vsuhachev
    Расширяемое и производительное приложение можно разработать на любом языке, вопрос как всегда в исполнителях.

    Вы рассуждаете слишком наивно: вложу в 2 раза меньше и получу то же самое. Увы, получить вы можете все что угодно от в 10 раз лучше до в 10 раз хуже, независимо от технологии.

    Если речь идет об одном и том же разработчике - все равно одной технологией (PHP) он владеет лучше и возможно вам предлагают еще и оплатить свое обучение (Rails) с не прогнозируемым для вас результатом.

    Если это разные разработчики, то тут нужно смотреть и сравнивать. Возможно те кто просят дешевле и делают хуже. Или, например, стандартные требования укладываются в их CMSку, а вот расширенные - ценник может вырасти в 5 раз.

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

    PS: почитал тут про тормознутость ruby от коллег php-шников, кратко - это миф из давнего прошлого, современному положению дел не соответствует
    Ответ написан
    Комментировать
  • Как понять в чем проблема, постоянно засоряет лог ошибками Apache2 в ubuntu?

    @vsuhachev
    На счет сжатия и очистки логов - поглядите /etc/logrotate.d/apache2
    Ответ написан
    Комментировать
  • Какой дистрибутив Linux для веб разработок?

    @vsuhachev
    Ubuntu, она активно развивается и популярна. Глюки бывают, но комьюнити настолько обширно что все решения гуглятся без проблем.

    Помимо самой Убунты есть еще куча основанных на ней дистров с разными окружениями рабочего стола на любой вкус и цвет.
    Ответ написан
    Комментировать
  • Язык программирования под конкретную задачу + с нуля + хорошая база?

    @vsuhachev
    Мне кажется вы слишком глобальные цели ставите. Программирование контроллеров, 1С, Web, GUI для iOS, Android, PC (Windows? Linux? MacOS?) это обширные области со своей спецификой.

    Более рационально на мой взгляд не искать "серебряную пулю" под все ваши желания, а взять минимальную задачу и реализовать ее на одном из современных мэйнстримовых языков программирования. В процессе поймете уже, готовы ли вы к задачам максимум и куда вам нужно двигаться.

    Python, Ruby, JS/CoffeeScript вполне годные кандидаты.

    Java, С# - в принципе тоже

    PHP - категорически не рекомендую, но его стабильно выбирают новички потому что он концептуально простой и популярный.

    Ну и еще из опыта - относитесь к выбору языка программирования как к выбору инструмента под задачу, а не как к единственному выбору на всю жизнь. У программистов считается хорошим тоном неплохо знать 2-3 языка, и поверхностно десяток-другой.
    Ответ написан
    1 комментарий
  • Какое выбрать железо для программирования ?

    @vsuhachev
    В качестве шутки (в которой есть доля шутки) - поставьте Линукс, у меня примерно те же программы RubyMine, Gimp, 3 браузера, пара виртуалок и 8G памяти. Лагов нет
    Ответ написан
    Комментировать
  • Как заставить украинского хостера удалить мой старый сайт?

    @vsuhachev
    Что (скорее всего) произошло: вы купили хостинг с доменом "в подарок", раскрутили его. Но не учли один момент - домен был во владении хостера nic.ru. После того как вы не оплатили услуги, хостер отпустил домен и его купил кто-то, причем легально. Нужно выяснять кто сейчас владеет вашим доменом и пытаться договорится или подавать на него в суд. На счет законодательства и судов - честно скажу я не спец.

    PS: nickhost.com не имеет никакого касательства к вашей проблеме, это всего лишь хостинг-площадка, на которой новый владелец домена разместил сайт. Вместо nickhost.com мог быть абсолютно любой хостер в пределах нашего шарика.
    Ответ написан
  • Как работать с мелкими css-файлами?

    @vsuhachev
    Поглядите на sprockets, по всем признакам это то что вам нужно. Эта библиотека используется в RubyOnRails как раз для сборки css, js и умеет компилировать scss/sass, CoffeeScript

    Для сборки используются т.н. файлы-манифесты (свои для css и js) в которых вы указываете что должно быть упаковано в результирующий файлы (css и js соответственно).

    Например манифест для css, в нем используются команды
    require_self - включить в сборку сам манифест (то, что после комента-манифеста)
    require path/filename - включить конкретный файл, как правило это сторонние компоненты
    require_tree . - включить все файлы из каталога, в данном примере все что лежит в каталоге с манифестом

    /*
     *= require_self
    
     *= require bootstrap-datepicker
     *= require select2
     *= require select2-bootstrap
     *= require dropzone-basic
    
     *= require_tree .
     */


    Тут пример как это все запустить
    Ответ написан
    Комментировать
  • Какая хорошая практика создания "своих" функций в Rails?

    @vsuhachev
    Помимо упомянутых коллегами каталога lib и своего гема можно выделять классы в подкаталоги в app. В отличии от lib все подкаталоги app находятся в автозагрузке по умолчанию, то есть не нужно писать require вручную. Ну и по смыслу - в app размещают то, что относится непосредственно к текущему приложению, а в lib - или код от "сторонних производителей", либо свой более независимый от текущего приложения код с прицелом на выделение и использование его в других проектах.
    Ответ написан
    3 комментария