<irony>Майкл Хартл — самый ужасный программист в мире!</irony>

ноября 18, 2012  |  Published in Best Practices, Уголок философа

Не раз ко мне обращались с какими-то вопросами, вроде помоги найти ошибку или что-то вроде того, когда я находил в годе копрокод, точнее, когда я находил, что весь код в целом — копрокод, то мне в лицо бросались ссылкой на ставшую популярной книгу Майкла Хартла. Последний такой случай сподвиг меня на написание этой философской статьи, которую многие по праву могут назвать водой, а автора которой мудаком, который должен облить себя бензином и поджечь.

Собственно из-за того бросания в меня ссылками на Хартла и родилось это название <irony>Майкл Хартл — самый ужасный программист в мире!</irony>. Я надеюсь, что использование тега <irony></irony> спасет меня от «Ты сам мудак! Хартл — няша!» ибо, как показывает практика, людей обидчивых и не понимающих иронию очень много. К Майклу Хартлу я отношусь очень хорошо, он написал хорошую книгу, которую я рекомендовал бы к прочтению всем и хотя у меня есть несколько мелких разногласий с автором, я все же считаю его отличным программистом, а его книгу обязательной для прочтения. Read the rest of this entry »

Tags: , , , ,

Правильная работа с ActiveRecord

июля 21, 2012  |  Published in Model, Ruby on Rails, Ruby on Rails 3

Статья будет иметь несколько хаотичной. В ней я приведу несколько примеров того, что я считаю неправильной работой с ActiveRecord. Что-то в статье — истина последней инстанции, а что-то — субъективное и, возможно, ошибочное мнение автора. Статья ориентирована на тех, кто хоть немного знаком с Ruby on Rails.

Очень популярная ошибка — не использование limit(1) для выборки одиночной записи с использованием where и других методов Quering API. Суть ошибки в том, что Rails не может за вас подумать о том, что вам необходима одна единственная запись, а не все удовлетворяющие условию. В случае, когда вы не используете limit(1) будет выполняться поиск по всей таблице, а не только до первой соответствующей условию записи.

Word.where(word: 'cat')
# Word Load (0.9ms) SELECT "words".* FROM "words" WHERE "words"."word" = 'cat'
# => [records]

Word.where(word: 'cat').limit(1)
# Word Load (0.7ms) SELECT "words".* FROM "words" WHERE "words"."word" = 'cat' LIMIT 1
# => [record]

UPD Вообще не пользуйтесь .limit(1), вместо .limit(1) используйте first, если вам действительно необходим лишь один элемент. Дело в том, что limit(1) возвращает массив с одним единственным элементом, чтобы получить этот элемент нам необходимо вызывать еще один метод — first (Array#first), или обращаться к элементу через индекс — Model.limit(1)[0].

Tag.limit(1).first
# Tag Load (1.6ms)  SELECT "tags".* FROM "tags" LIMIT 1

Tag.first
# Tag Load (0.8ms)  SELECT "tags".* FROM "tags" LIMIT 1

Read the rest of this entry »

Tags: , , ,

routing_concerns или будущее маршрутизации в Ruby on Rails 4.0

июля 3, 2012  |  Published in Ruby on Rails, Ruby on Rails 3

spaghetti codeВсего 5 дней назад DHH добавил новый репозиторий организации Rails на Github. представляет собой расширение Rails проверенное на работоспособность только с Rails 3.2 и предназначенное для выDRYивания кода маршрутизации.

Принцип работы плагина простой, вы объявляете concern’ы, а в них помещаете код общий для нескольких ресурсов.
Read the rest of this entry »

Tags: , , , , , ,

Thor – божественный фреймворк для создания задач

июня 28, 2012  |  Published in Ruby, Ruby Gems, Ruby on Rails, Ruby on Rails 3

– это альтернатива для всем известного Rake. Автором Thor является небезызвестный , хотя если посмотреть на коммиты в репозитории Thor, то Катц находится только на 4 месте, но сейчас не об этом. Thor – создавался как более изящная альтернатива фреймворку Rake и это вполне удалось его авторам. Я надеюсь, что по прочтению данной статьи вы не только научитесь работать с Thor, но и замените им Rake.

Для установки thor воспользуйтесь командой:

$ gem install thor

Если вы программируете с использованием фреймворка Ruby on Rails, то Thor уже уже установлен так как находится в зависимостях у Rails и используется внутри Rails для создания генераторов.
Установив Thor у вас появится возможность использовать в консоли команду thor:

$ thor -v
Thor 0.15.3

$ thor
Tasks:
thor help [TASK] # Describe available tasks or one specific task
thor install NAME # Install an optionally named Thor file into your syst…
thor installed # List the installed Thor modules and tasks
thor list [SEARCH] # List the available thor tasks (—substring means .*S…
thor uninstall NAME # Uninstall a named Thor module
thor update NAME # Update a Thor file from its original location
thor version # Show Thor version

Прежде чем создать первую задачу Thor вы должны быть знакомы с некоторыми соглашениями:

  1. Задачи Thor имеют расширение .thor
  2. Имена файлов в которых имеются задачи должны соответствовать именам классов.
  3. Классы используются в для создания пространств имен.
  4. Каждая задача – это просто метод.

Теперь мы можем приступить к созданию первой задачи. В файл first_task.thor поместим следующий код на Ruby:

Read the rest of this entry »

Tags: , , , ,

QuasarLog: День первый + Знакомство с FactoryGirl

апреля 27, 2012  |  Published in CMS, QuasarLog

Весточка с передовой.

О QuasarLog’е

В этой рубрике я буду писать о прогрессе в разработке Quasar и некоторых интересных вещах, которые вот уже реально могут быть полезны читателям RubyDev. Например в этом посте мы рассмотрим код FactoryGirl фабрики для модели User из Quasar. Об этом я уже писал в нашей группе во вконтакте. Если хотите быть в курсе развития проекта и RubyDev, то вот вам:

Read the rest of this entry »

Tags: , , , , , ,

Ruby on Rails 3: Ассоциации между моделями ч. 2

апреля 26, 2012  |  Published in Ruby on Rails, Ruby on Rails 3, Базы данных

ruby on rails tutorial Ассоциации между моделями ч. 1. В этой статьи мы поговорим об интересных параметрах и возможностях ассоциаций моделей.

Псевдонимы

Часто бывает необходимо или желательно использовать отличное от имени модели имя ассоциации. Например у нас есть две модели Store и User и у Store имеется владелец (seller — продавец). store.user выглядит не очень красиво, как буд-то речь идет о пользователе магазина, а не о его владельце (продавце), кроме того, у нас может быть несколько ассоциаций с моделью User, например у нас может быть buyer и seller.
Read the rest of this entry »

Tags: , , ,

Установка Ruby и Rails в Windows используя RubyInstaller и DevKit

апреля 15, 2012  |  Published in Ruby, Ruby Gems, Ruby on Rails, Основы

rubyinstallerУстановить Ruby в Windows почти так же легко, как и в Ubuntu. Сразу хочу предупредить, что в работе Ruby под Windows имеется несколько ограничений, особенно это касается работы с файловой системой и процессами. Также не все библиотеки Ruby (gem’ы) отлично работают в Windows, например один из самых распространенных серверов для Rails — Unicorn заточен под Linux и совсем не работает под Windows.

Read the rest of this entry »

Tags: , ,

Ruby on Rails 3: Ассоциации между моделями ч. 1

апреля 5, 2012  |  Published in Ruby on Rails, Ruby on Rails 3, Базы данных

ruby on rails tutorial Ассоциации между моделями ч. 2. Экземпляры моделей представляют собой сущности реального мира, а ассоциации между ними являются ни чем иным как отношениями этих сущностей между собой.

ActiveRecord предоставляет несколько возможных ассоциаций (типов отношений) между моделями и все они представлены ниже.

 belongs_to — принадлежность другой модели. Пример:

 

class Post < ActiveRecord::Base
  belongs_to :category
end

Read the rest of this entry »

Tags: , , ,

Ruby on Rails 3: Основы работы с ActiveRecord моделью

февраля 10, 2012  |  Published in Ruby on Rails, Ruby on Rails 3, Базы данных

ruby on rails tutorialRubyDev — ваш друг в изучении Ruby и Rails!

Что такое модель?

Модель — это составляющая часть архитектурного паттерна MVC, которая хранит бизнес логику. В вашем приложении все модели должны храниться в директории app/models в отдельных файлах, имена которых должны соответствовать имени модели, например: Post -> post.rb, InvoiceProduct -> invoice_product.rb.

Как связаны модель и таблица?
В большинстве случаев модель ассоциируется с определенной таблицей в базе данных, например модель Post будет ассоциироваться с таблицей posts. Экземпляр модели являет собой объект представляющий одну запись из таблицы, а сама модель (класс) используется для работы со всей таблицей, например для поиска всех записей соответствующих некоторому условию.

Обратите внимание на то, как называется модель и как называется соответствующая ей таблица. Имя модели — всегда в едином числе, а имя таблицы во множественном.

Как создать модель?
Создать модель можно вручную, но лично я предпочитаю использовать генератор моделей:

$ rails g model Product name:string description:text price:integer
      invoke  active_record
      create    db/migrate/20120210115708_create_products.rb
      create    app/models/product.rb
      invoke    test_unit
      create      test/unit/product_test.rb
      create      test/fixtures/products.yml

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

Генератор модели мне кажется более удобным потому, что одной командой я создаю сразу все необходимые для работы файлы: собственно модель, миграцию для создания соответствующей модели таблицы в БД, файл фикстур и болванку для написания тестов.
Read the rest of this entry »

Tags: , , , , , , ,

Ruby on Rails 3: Миграции в Rails 3.x

февраля 9, 2012  |  Published in Ruby on Rails, Ruby on Rails 3

ruby on rails tutorialRubyDev — ваш друг в изучении Ruby и Rails!

Миграции — это очень удобный инструмент для управления структурой базы данных без использования SQL.

Как работают миграции?

Миграции — это обыкновенные классы, которые наследуются от ActiveRecord::Migration, описывают структуру базы данных и хранятся в директории db/migrate/ вашего проекта.  При использовании генератора scaffold или генератора моделей автоматически будет создан и класс миграции для создания соответствующей модели таблицы.

$ rails g model Post title:string content:text

В результате помимо создания самой модели будет создан еще и файл миграции следующего содержимого:

#db/migrate/20120126202608_create_posts.rb
class CreatePosts < ActiveRecord::Migration
  def change
    create_table :posts do |t|
      t.string :title
      t.text   :content

      t.timestamps
    end
  end
end

В предыдущих версиях Rails использовались методы self.up и self.down для соответственно выполнения и отката миграции. В Rails 3.1, как показано выше используется один единственный метод change вместо self.up и self.down. Методы up и down также доступны, но в большинстве случаев достаточно метода change.

Для выполнения миграций необходимо выполнить команду:

$ rake db:migrate

Запуск этой команды выполнит все имеющиеся миграции, что ранее не были выполнены. Read the rest of this entry »

Tags: , , , , ,