Программирование на Ruby - Новости
Play - музыкальный сервер от GitHub
сб, 19/05/2012 - 11:49 — spine
Продолжая тему слайдов, хочу поделиться ссылкой на стопку слайдов к выступлению Зака Холмана (Zach Holman) - . Вы узнаете о проекте Play - музыкальном сервере в офисе GitHub.
Просто красивые слайды, это еще не конец истории :) Код Play открыт и доступен на GitHub - . Play имеет специфичные требования к окружению, но об этом подробно рассказано в README.
P.S. Советую посмотреть и другие слайды от Зака, если вы этого еще не сделали.
Слайды доклада "10 Things You Didn't Know Rails Could do" от JEG2
пт, 18/05/2012 - 09:37 — spine
Прогугливаясь по просторам интернета в поисках инетересной информации, я наткнулся на доклад ruby-гуру Джеймса Эдварда Грея II. В нем собрана информация о функциональности rails, о которой вы, возможно, и не знали. Лично я для себя нашел достаточно много нового, надеюсь, вы тоже найдете... Приятного чтения!
С уважением, .
"Stay young, stay curious, stay hippy..." - доклад Дэвида Хайнемайера Хенссона с конференции "RailsConf 2012"
ср, 16/05/2012 - 21:35 — spine
В сети выложен видео-доклад Дэвида с конференеции "RailsConf 2012". Всем, кто еще не видел, очень советую...
Молодой, знергичный, дерзкий и в то же время достаточно мудрый, он высказал свою точку зрения на прогресс в разработке программного обеспечения в целом и rails в частности.
Несмотря на наличие ненормативной лексики, доклад получился очень и очень хорошим. Я получил массу удовольствия и не раз посмеялся, чего и вам желаю.
С уважением, .
Skypekit for Ruby
пт, 11/05/2012 - 15:52 — spineActiveRecord::Relation#merge или как объединиться с друзьями
пт, 11/05/2012 - 12:45 — spine
Цель данного обзора показать пару приемов использования метода #merge из модуля ActiveRecord::SpawnMethods, предназначенного для объединения скоупов.
relation_destination.merge(relation_source) добавляет sql-выражение из relation_source в итоговый relation_destination. Приведу пару примеров.
Допустим мы хотим получить список всех оплаченных заказов, но только для клиентов с голубыми глазами. В общем случае это могло бы быть так:
Order.paid.joins(:user).where(:users => { :eye_color => 'blue' })
# => SELECT "orders".*
FROM "orders"
INNER JOIN "users" ON "users"."id" = "orders"."user_id"
WHERE "orders"."status" = 3 AND "users"."eye_color" = 'blue'
Но в таком подходе есть проблема: мы должны знать все тонкости выборки этих самых клиентов с голубыми глазами. И возможно, что таковыми должны быть не только клиенты с признаком eye_color => 'blue', но и со статусом равным 1. В таком случае, чтобы разместить логику «голубых глаз» в едином удобном месте логично сделать scope в модели User:
class User < ActiveRecord::Base
STATUS = { :visible => 1 }
has_many :orders
scope :blue_eye, where(:eye_color => 'blue', :status => STATUS[:visible])
end
Теперь мы можем изменить первый вариант на:
Order.paid.where(:user_id => User.blue_eye.pluck(:id))
# => SELECT id FROM "users" WHERE "users"."eye_color" = 'blue' AND "users"."status" = 1
# => SELECT "orders".* FROM "orders"
WHERE "orders"."status" = 3 AND "orders"."user_id" IN (2, 3)
Таким образом мы избавились от первоначальной проблемы. Но возник другой момент: такая запись генерирует 2 запроса к БД (к пользователям и к заказам). При этом id'шники пользователей будут переданы во второй sql-запрос. И если пользователей с голубыми глазами будет много (сотни/тысячи), то sql-команда получится очень длинной и в большинстве случаев далеко не оптимальной (разбор плана и т.д.).
И вот на помощь к нам приходит Relation#merge:
Order.paid.joins(:user).merge(User.blue_eye)
# => SELECT "orders".*
FROM "orders" INNER JOIN "users" ON "users"."id" = "orders"."user_id"
WHERE "orders"."status" = 3 AND "users"."eye_color" = 'blue' AND "users"."status" = 1
Такая цепочка вернет нужные нам заказы за один запрос с использованием SQL оператора JOIN. На мой взгляд, это выглядит достаточно лаконично, причём как с точки зрения AR, так и точки зрения результирующего sql-запроса. Если по какой-то причине мы изменим логику получения клиентов с голубыми глазами, то достаточно будет изменить scope в модели User и все другие запросы получат новые условия.
Давайте теперь станем более социально-ориентированными и сделаем выборку не просто по всем пользователям, а по друзьям. Цель: получить список самых популярных статей среди друзей подтвердивших статус дружбы. Для этого можно воспользоваться вот такими вот моделями:
class Friendship < ActiveRecord::Base
STATUS = {:verified => 5}
belongs_to :user
belongs_to :friend, :class_name => 'User',
:conditions => { :friendships => { :status => STATUS[:verified] } }
end
class Article < ActiveRecord::Base
belongs_to :user
end
class User < ActiveRecord::Base
STATUS = { :visible => 1 }
has_many :friendships, :dependent => :destroy
has_many :friends, :through => :friendships,
:conditions => { :status => STATUS[:visible] }
has_many :articles
end
Несколько вариантов достижения поставленной цели:
1) Все условия зараз:
user = User.first
Article.joins(:user).joins('INNER JOIN friendships on users.id = friendships.friend_id').
where(:friendships => { :user_id => user, :status => Friendship::STATUS[:verified]}).
where(:users=>{:status => User::STATUS[:visible]}).order('articles.rating desc')
# => SELECT "articles".*
FROM "articles" INNER JOIN "users" ON "users"."id" = "articles"."user_id"
INNER JOIN friendships on users.id = friendships.friend_id
WHERE "friendships"."user_id" = 1 AND "friendships"."status" = 5 AND "users"."status" = 1
ORDER BY articles.rating desc
2) 2 sql-запроса, идентификаторы пользователей передаются списком в функцию IN:
user = User.first
Article.where(:user_id => user.friends).
order('articles.rating desc')
# => SELECT "users".*
FROM "users" INNER JOIN "friendships" ON "users"."id" = "friendships"."friend_id"
WHERE "friendships"."user_id" = 1
AND ("friendships"."status" = 5 AND "users"."status" = 1)
# => SELECT "articles".* FROM "articles"
WHERE "articles"."user_id" IN (2, 3)
ORDER BY articles.rating desc
3) В один запрос с JOIN:
user = User.first
Article.joins(:user).merge(user.friends.scoped).
order('articles.rating desc')
# => SELECT "articles".*
FROM "articles" INNER JOIN "users" ON "users"."id" = "articles"."user_id"
INNER JOIN "friendships" ON "users"."id" = "friendships"."friend_id"
WHERE "friendships"."user_id" = 1
AND ("friendships"."status" = 5 AND "users"."status" = 1)
ORDER BY articles.rating desc
Пример с Relation#merge демонстрирует как получить sql-запрос с объединением по друзьям. Не мало важно то, что в запрос включены все те условия, которые мы задали в ассоциациях.
На этом можно было бы и закончить данный обзор, но остался ещё один подводный камень: в Rails 3.0.x такой красивый merge к сожалению изменит SELECT "articles".* FROM на SELECT "users".* FROM, что в результате вернет пользователей, а не статьи. Чтобы это побороть, можно добавить метод экземпляра в модель User:
def join_friends
Friendship.scoped.
joins('INNER JOIN friendships on friendships.friend_id = users.id').
where(:user_id => id, :status => Friendship::STATUS[:verified]).
where(:users => {:status => STATUS[:visible]})
end
Тогда популярные статьи друзей можно получить так:
user = User.first
Article.joins(:user).merge(user.join_friends).
order('articles.rating desc')
# => SELECT "articles".*
FROM "articles" INNER JOIN "users" ON "users"."id" = "articles"."user_id"
INNER JOIN friendships on friendships.friend_id = users.id
WHERE "friendships"."user_id" = 1 AND "friendships"."status" = 5 AND "users"."status" = 1
ORDER BY articles.rating desc
Вот и все, спасибо за внимание!
Полезные ссылки:
SeedDump
чт, 10/05/2012 - 10:05 — spine
SeedDump - плагин добавляющий rake-задачу db:seed:dump. Эта задача генерирует файл db/seeds.rb на основе уже существующей базы данных.
Пример:
rake db:seed:dump
Получаем файл db/seeds.rb со следующим содержимым:
# Autogenerated by the db:seed:dump task
# Do not hesitate to tweak this to your needs
products = Product.create([
{ :category_id => 1, :description => "Long Sleeve Shirt", :name => "Long Sleeve Shirt" },
{ :category_id => 3, :description => "Plain White Tee Shirt", :name => "Plain T-Shirt" }
])
users = User.create([
{ :id => 1, :password => "123456", :username => "test_1" },
{ :id => 2, :password => "234567", :username => "tes2" }
])
Есть возможность добавлять в файл, а не перезаписывать его. Можно указать другой выходной файл, а не только db/seeds.rb.
Узнайте остальные подробности в README на GitHub -
Bloggy - возможность добавить блог на базе Jekyll в Rails-приложение
чт, 10/05/2012 - 09:57 — spine
Bloggy - это небольшая библиотека, позволяющая "завести" блог на базе Jekyll в вашем Rails-приложении.
Jekyll - это генератор статических сайтов, созданный Томом Престоном-Вернером ().
Чтобы начать пользоваться Bloggy, добавьте в Gemfile следующую строку:
gem ‘bloggy’
и выполните
$ bundle
Далее генерируем все необходимое для первого старта:
$ rails g jekyll:blog blog
Готово! Ваш блог доступен по адресу
Хотите знать больше? Читайте подробности в README на GitHub -
Фестиваль профессионального развития для IT-специалистов – Bit Byte
вт, 08/05/2012 - 10:09 — spine
19 мая компания ITmozg проводит в Санкт-Петербурге крупнейшее мероприятие для IT-специалистов – Bit Byte.
Bit Byte – это фестиваль профессионального развития, где студенты технических специальностей, и специалисты с опытом работы в IT в 2-4 года после окончания ВУЗа смогут пообщаться с представителями крупнейших IT-компаний и успешных стартапов и послушать выступления звезд IT.
В программе:
Общение с лучшими компаниями страны и города: EMC, Mail.ru Group, Oracle, Embria, Motorola Mobility, Ascreen , Epam, «Код безопасности», «Институт Сетевых технологий» и другие.
Выступления экспертов. Своим опытом поделятся эксперты из проекта «Одноклассники» компании Mail.ru Group, компаний «Яндекс.Деньги», «Фотострана.ру», Oktogo, Sup Media. Из Москвы специально на мероприятие приезжают Алена Попова и Леонид Бугаев. Руководитель ЖЖ в России, Илья Дронов, тоже приедет на конференцию, правда, не выступать, а просто как участник.
А также внимание к стартапам, гаджеты и игрушки.
Посещение мероприятия бесплатное для всех зарегистрированных пользователей.
Все подробности на .
Ruby для iOS
пт, 04/05/2012 - 10:22 — spine
RubyMotion позволяет писать нативные iOS-приложения на Ruby, а не Objective-C.
Вы пишите приложение, используя привычные для Ruby-программиста инструменты - консоль, Rake, gem-библиотеки, ваш любимый текстовый редактор.
RubyMotion не является бесплатным продуктом, но сейчас можно получить скидку в 25% (early bird discount). На данный момент стоимость пакета с учетом скидки составляет 4638,22 руб.
Ссылки по теме:
Brainwashing: мастер-класс по разработке на Ruby on Rails
ср, 25/04/2012 - 20:15 — spine
Evil Martians в третий раз.
На курсе будет 18 учеников и 3 инструктора из Evil Martians. Это позволит инструкторам проводить практические занятия, уделять максимум внимания каждому участнику.
Курс состоит из восьми блоков-тем, каждая из которых состоит из теоретической и практической части. Участники курса за два дня получат багаж новых знаний и смогут уже в понедельник начать применять их на практике:
- как определять, что не так с приложением и как это исправить;
- как оптимизировать и автоматизировать фронт-энд;
- как организовывать работу с кодом;
- как готовить приложение к высоким нагрузкам и решать возникающие при этом проблемы.
Brainwashing будет полезен уже опытным Ruby on Rails разработчикам, архитекторам и тимлидам. Участие в курсе платное, 30 000 руб.
Хотите участвовать? !
Кстати, вот . Вы можете задать нам вопросы, пообщаться с участниками прошедших курсов на .
marginalia - помощь в определении медленных запросов
ср, 25/04/2012 - 11:40 — spine
37signals в очередной раз поделились с миром своим инструментом. На этот раз это небольшая библиотека, которая позволяет добавлять комментарии к логу запросов, выполняемых ActiveRecord.
Выглядит это примерно так:
Account Load (0.3ms) SELECT `accounts`.* FROM `accounts`
WHERE `accounts`.`queenbee_id` = 1234567890
LIMIT 1
/*application:BCX,controller:project_imports,action:show*/
Зовется библиотека marginalia. Работоспособность протестирована в Rails 2.3.x и Rails 3.x.x.
Подробности об установке и использовании, а также исходный код доступены на GitHub - .
Историю возникновения marginalia можно узнать из статьи .
Rails Rumble 2012 задерживается
вт, 24/04/2012 - 17:05 — spine
Команда Rails Rumble опубликовала в своем блоге сообщение о том, что состязание этого года откладывается до конца лета. Изначально событие было намечено на начало 2012, но из-за огромного количества дел, его пришло отложить.
Для тех кто не знает о том, что такое Rails Rumble. Это онлайн-состязание между разработчиками, которое проходит в течении 48 часов. Смысл в том, чтобы за ограниченное время создать интересное приложение.
Победитель получает настоящий пояс чемпиона :)
Ссылки:
- официальный сайт -
- сообщение о задержке состязания в этом году -
- архив предыдущих событий -
Создание и настройка рабочего окружения разработчика на Ruby и Ruby on Rails
сб, 21/04/2012 - 19:07 — spine
В этой статье мы рассмотрены:
Установка Git
Установка RVM - Ruby Version Manager для возможности работы с несколькими версиями Ruby, а также наборами библиотек Ruby - Gem’ами.
Установка собственно Ruby: Ruby 1.8.7 и Ruby 1.9.3
Установка SQLite, MySQL, PostgreSQL
Установка фреймворка Ruby on Rails 3.2 и его зависимостей
Установка Node.js как среду выполнения JavaScript
Создание нового проекта Rails
Работа с зависимостями проекта
Настройка тестового окружения и написание простых спецификаций и тестов
Написание кода приложения по спецификациям
Установка Nginx и Unicorn, и запуск приложения Rails на Unicorn и Nginx прокси
Работа с удаленным репозиторием
Работа с Continuous Integration (CI) сервером - Travis
