<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>Flatsoft</title>
	<atom:link href="http://flatsoft.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://flatsoft.com</link>
	<description>Flatsoft</description>
	<pubDate>Fri, 21 Oct 2011 11:58:36 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Процессы</title>
		<link>http://flatsoft.com/2011/06/10/protsessyi/</link>
		<comments>http://flatsoft.com/2011/06/10/protsessyi/#comments</comments>
		<pubDate>Fri, 10 Jun 2011 14:42:54 +0000</pubDate>
		<dc:creator>developer</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://flatsoft.com/?p=650</guid>
		<description><![CDATA[
Choosing a task

если ваши таски реопенед, применяете комменты
если есть свободные ревью таски (Pending review, assigned to Dilyara), берете себе и делаете ревью
если ни комментов, ни ревью нет, но есть незаконченный таск, то продолжаете его
если ни комментов, ни ревью нет и все таски закончили, то берете новый таск (assigned to Dilyara)
если новых тасков нет, то думаете, [...]]]></description>
			<content:encoded><![CDATA[<div class="writeboardbody">
<h2>Choosing a task</h2>
<ol>
<li>если ваши таски реопенед, применяете комменты</li>
<li>если есть свободные ревью таски (Pending review, assigned to Dilyara), берете себе и делаете ревью</li>
<li>если ни комментов, ни ревью нет, но есть незаконченный таск, то продолжаете его</li>
<li>если ни комментов, ни ревью нет и все таски закончили, то берете новый таск (assigned to Dilyara)</li>
<li>если новых тасков нет, то думаете, что можно изменить/улучшить</li>
</ol>
<h2>Working on a story</h2>
<ul>
<li>нажимаем “Start” (или “Accept bug”)</li>
<li>стори делаем в отдельной ветке</li>
<li>ветку называем feature/{номер стори}-{тайтл стори маленькими  буквами с минусами вместо пробелов, спецсимволов и camel case} (например  feature/123-update-media-type-tagged-text-selection для #123 Update  MediaType::TaggedTextSelection)
<ul>
<li>если стори зависит от другой незаревьювленной стори – ветку форкаем от ветки той стори</li>
<li>иначе от develop</li>
</ul>
</li>
<li>как сделали стори:
<ul>
<li>нажимаем “Assign for review” и ассигним на Диляру</li>
</ul>
</li>
<li>когда делаем ревью
<ul>
<li>нажимаем “Start review”</li>
<li>используем команду git review {story number} (<span class="caps">TBD</span>)</li>
<li>нажимаем “Assign for test” и ассигним на автора стори или на Фила; или</li>
<li>нажимаем “Fail review”</li>
</ul>
</li>
<li>после того, как вашу стори заревьювили и протестили:
<ul>
<li>делаем rebase и squash с develop – сливаем все коммиты в один</li>
<li>коммит месседж должен быть в виде [GD-{номер стори}] {тайтл стори} (например [GD-123] Update MediaType::TaggedTextSelection)</li>
<li>мерджим ветку в develop</li>
<li>удаляем ветку локально и из github (!!!)</li>
<li>нажимаем “Merged to Develop”</li>
</ul>
</li>
</ul>
</div>
]]></content:encoded>
			<wfw:commentRss>http://flatsoft.com/2011/06/10/protsessyi/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Новости</title>
		<link>http://flatsoft.com/2011/05/19/novosti/</link>
		<comments>http://flatsoft.com/2011/05/19/novosti/#comments</comments>
		<pubDate>Thu, 19 May 2011 11:53:10 +0000</pubDate>
		<dc:creator>Tatyana Vyruchaeva</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://flatsoft.com/?p=645</guid>
		<description><![CDATA[Всем привет!
От нашего &#8220;Райффайзенбанка&#8221; есть приятные новости!
От них поступила следующая информация, предлагаю к ознакомлению:
&#8220;Уважаемые сотрудники компании Флэтсофт, добрый день!
Рады сообщить, что для сотрудников Вашей компании  Райффайзенбанк
предлагает льготные условия по следующим программам кредитования:
Ипотека
Потребительский кредит
Кредитные карты
Просим Вас донести данную информацию до коллектива.
Будем рады ответить на Ваши вопросы в нашем офисе по адресу: г.
Казань, ул. Ершова 35А [...]]]></description>
			<content:encoded><![CDATA[<p>Всем привет!</p>
<p>От нашего &#8220;Райффайзенбанка&#8221; есть приятные новости!<br />
От них поступила следующая информация, предлагаю к ознакомлению:</p>
<p>&#8220;Уважаемые сотрудники компании Флэтсофт, добрый день!</p>
<p>Рады сообщить, что для сотрудников Вашей компании  Райффайзенбанк<br />
предлагает льготные условия по следующим программам кредитования:</p>
<p>Ипотека</p>
<p>Потребительский кредит</p>
<p>Кредитные карты</p>
<p>Просим Вас донести данную информацию до коллектива.</p>
<p>Будем рады ответить на Ваши вопросы в нашем офисе по адресу: г.<br />
Казань, ул. Ершова 35А или по телефону: (843) 567 59 00.</p>
<p>С уважением,<br />
Дина Акулова</p>
<p>Специалист группы ипотечного кредитования<br />
ОО &#8220;Казанский&#8221; ЗАО &#8220;Райффайзенбанк&#8221;<br />
г. Казань, ул. Ершова 35А<br />
т. (843) 567-59-16, вн. 2602&#8243;</p>
]]></content:encoded>
			<wfw:commentRss>http://flatsoft.com/2011/05/19/novosti/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Курсы. День 10</title>
		<link>http://flatsoft.com/2010/11/23/kursyi-den-10/</link>
		<comments>http://flatsoft.com/2010/11/23/kursyi-den-10/#comments</comments>
		<pubDate>Tue, 23 Nov 2010 12:28:08 +0000</pubDate>
		<dc:creator>leoniddinershtein</dc:creator>
		
		<category><![CDATA[RubyOnRails]]></category>

		<guid isPermaLink="false">http://flatsoft.com/?p=631</guid>
		<description><![CDATA[Конспект Евгения
Блоки
Блоки, процедуры и лямбды — замыкания (closures) — являются важным аспектом языка Ruby, с одной стороны, и малопонятным с другой. Малопонятным в основном из-за того, что Ruby подходит к замыканиям в значительной степени уникальным образом, к тому же в Ruby существуют разные способы использования замыканий. 
Способ первый. Proc / Lambda
Любой кусок кода в руби [...]]]></description>
			<content:encoded><![CDATA[<p>Конспект Евгения</p>
<p><strong>Блоки</strong><br />
Блоки, процедуры и лямбды — замыкания (closures) — являются важным аспектом языка Ruby, с одной стороны, и малопонятным с другой. Малопонятным в основном из-за того, что Ruby подходит к замыканиям в значительной степени уникальным образом, к тому же в Ruby существуют разные способы использования замыканий. </p>
<p><span id="more-631"></span><strong>Способ первый. Proc / Lambda</strong><br />
Любой кусок кода в руби можно выделить в особой тип объекта - блок. Блок кода явялется объектом класса Proc. для его создания необходимо выполнить</p>
<p><code>some_block = Proc.new { puts 'from some blcok' }</code><br />
или<br />
<code>some_block = lambda do<br />
  puts 'from lambda'<br />
end</code></p>
<p>Сохраненный таким образом код можно использовать по разному. можно передвать в функции в качестве параметров, можно просто вызвать. Для передачи параметров в блок нужно определить его принимающим параметры. Список переменных в |аргумент1| будет определять параметры блока.<br />
<code>some_block_with_parameter = lambda do |name|<br />
  puts 'from lambda'<br />
end</code></p>
<p>для исполнения кода нужно вызвать метод .call объекта Proc, в зависимости от блока - с параметрами или без.<br />
<code>  some_block.call<br />
  some_block_with_parameter.call :argument</code></p>
<p>а вот пример работы функции с блоков<br />
<code>def my_func(block)<br />
  puts 'before block called'<br />
  block.call<br />
  puts 'after block called'<br />
end<br />
some_block = Proc.new { puts 'from some blcok' }<br />
my_func(block)<br />
=&gt;<br />
before block called<br />
from some blcok<br />
after block called<br />
</code></p>
<p>Блок, переданный таким способом ничем не отличается от параметра, и значит мы можем передвать любое количество в любом порядке. </p>
<p><strong>Способ второй. блоки</strong><br />
В отличие от от lambda/proc, блоки кода можно использовать только один раз, но и процедура их записи на порядок короче.<br />
<code>def my_func(&amp;block)<br />
  puts 'before block called'<br />
  block.call<br />
  puts 'after block called'<br />
end</code></p>
<p># другой способ передачи блока<br />
<code>my_func do<br />
  puts 'code from block'<br />
end</code></p>
<p>или с параметром</p>
<p><code>def my_func(&amp;block)<br />
  puts 'before block called'<br />
  block.call 'some name'<br />
  puts 'after block called'<br />
end</code><br />
<code>my_func do |name|<br />
  puts 'code from block ' + name<br />
end</code></p>
<p># можно и Proc передать, при необходимости</p>
<p><code>block = Proc.new { puts 'proc' }<br />
my_func(&amp;block)</code></p>
<p>В сокращенном виде это можно писать и так:</p>
<p><code>def my_func<br />
  # это проверка пришел ли блок<br />
  return unless block_given?<br />
  puts 'before block called'<br />
  yield 'some name'<br />
  puts 'after block called'<br />
end<br />
</code></p>
<p><code>my_func { |name|  puts 'called in function ' + name }</code></p>
<p>В завершении приведу примерную реализацию итератора по массиву<br />
<code>class Array<br />
  def my_each<br />
    i = 0;<br />
    while i &lt; self.size<br />
      yield self[i]<br />
      i+=1<br />
    end<br />
  end<br />
end<br />
(1..10).to_a.my_each { |element| puts element }</code></p>
<p>Отметим, что замыкания широко используются в ruby, более того, ни одна программа не обходится без них. </p>
<p><strong>Вопросы на дом</strong><br />
- найти отличия между lambda и proc<br />
- разница между передачей блока как block и как &amp;block</p>
<p><strong>Модули. Классы</strong><br />
Наиболее очевидное применение модулей - в качестве неймспейсов.<br />
<code>module Mathic<br />
  def self.abs<br />
    puts 'calculate abs'<br />
  end<br />
end<br />
</code></p>
<p><code>module Party<br />
  def self.abs<br />
    puts 'some drinking to absolute drinking state'<br />
  end<br />
end<br />
def abs<br />
  puts 'another method to_s'<br />
end<br />
abs<br />
Mathic.abs<br />
Party::abs<br />
</code></p>
<p>использование различных модулей позволяет разделить эти методы и переписать случайно какой либо из них.</p>
<p>Второе, и более частое использование модулей - в качестве примесей ( mixins ). Mixins - это механизм, с помощью которого в руби реализуется добавление общих методов  классы. Механизм более удобный и простой по сравнению с наследованием, особенно множественным или многоуровневым.</p>
<p><code>module Movable<br />
  def move<br />
    puts self.name + ' moved'<br />
  end<br />
end<br />
</code></p>
<p><code>class Tank<br />
  include Movable</p>
<p>  def name<br />
    'tank'<br />
  end<br />
end</p>
<p>class Ship<br />
  include Movable</p>
<p>  def name<br />
    'ship'<br />
  end<br />
end<br />
Ship.new.move<br />
Tank.new.move<br />
</code><br />
Как видно, добавленеи модуля через include расширяет функциональность объекта класса. для расширения функциональности самого класса необходимо воспользоваться ключевым словом extend. Продемонстрирую разницу между extend/example:<br />
<code><br />
module Foo<br />
  def foo<br />
    puts 'foo'<br />
    puts self.inspect<br />
  end<br />
end</p>
<p>module Bar<br />
  def bar<br />
    puts 'bar'<br />
    puts self.inspect<br />
  end<br />
end</p>
<p>class Unit<br />
  extend Foo<br />
  include Bar<br />
end</p>
<p>Unit.foo<br />
Unit.new.bar<br />
</code></p>
<p>А теперь более реальный пример. Расширение функциональности  происходит в нужный момент в нужном классе.</p>
<p><code>module Movable<br />
  # метод вызывается  момент  include Movable<br />
  def self.included(base)<br />
    # расширяем функциональность класса методом acts_as_movable_object<br />
    base.send :extend, ClassMethods<br />
  end</p>
<p>  module ClassMethods<br />
    def acts_as_movable_object<br />
      send :include, InstanceMethods<br />
    end<br />
  end</p>
<p>  module InstanceMethods<br />
    attr_accessor :name</p>
<p>    def move<br />
      puts self.name + ' moved'<br />
    end</p>
<p>    def stop<br />
      puts self.name + ' stopped'<br />
    end<br />
  end<br />
end</p>
<p>class Unit<br />
  include Movable<br />
end</p>
<p>class Tank &lt; Unit<br />
  # метод определен<br />
  acts_as_movable_object<br />
end</p>
<p>a = Unit.new<br />
a.name = 'unit'<br />
a.move<br />
a.stop</code></p>
<p>легко продолжить данный способ до любого количества модулей в меру своей фантазии.<br />
<code><br />
class Unit<br />
  include Movable<br />
  include Shootable<br />
  include Flyable<br />
  include Swimable<br />
end</code></p>
<p><code>class Ship &lt; Unit<br />
  acts_as_shootable<br />
  acts_as_swimable<br />
end</code></p>
<p><code>class Plane &lt; Unit<br />
  acts_as_flyable<br />
end</code></p>
]]></content:encoded>
			<wfw:commentRss>http://flatsoft.com/2010/11/23/kursyi-den-10/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Флэтсофт одевает</title>
		<link>http://flatsoft.com/2010/11/22/fletsoft-odevaet/</link>
		<comments>http://flatsoft.com/2010/11/22/fletsoft-odevaet/#comments</comments>
		<pubDate>Mon, 22 Nov 2010 09:37:06 +0000</pubDate>
		<dc:creator>Tatyana Vyruchaeva</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://flatsoft.com/?p=625</guid>
		<description><![CDATA[Решили мы тут в очередной раз выпустить ограниченный тираж футболок с нашим логотипом.
Первые выпуски уже поизносились, пора обновлять гардероб :) Тем более, что оригинальных текстовых идей все больше и больше, учитывая неординарность нашего мышления. 
Футболки будем дарить не только нашим сотрудникам, работающим в штате, но и тем, кто посещает наши курсы по &#8220;RubyOnRails&#8221;!
Ждем ваших пожеланий [...]]]></description>
			<content:encoded><![CDATA[<p>Решили мы тут в очередной раз выпустить ограниченный тираж футболок с нашим логотипом.<br />
Первые выпуски уже поизносились, пора обновлять гардероб :) Тем более, что оригинальных текстовых идей все больше и больше, учитывая неординарность нашего мышления. </p>
<p>Футболки будем дарить не только нашим сотрудникам, работающим в штате, но и тем, кто посещает наши курсы по &#8220;RubyOnRails&#8221;!</p>
<p>Ждем ваших пожеланий по поводу надписи, особое внимание тем, кто придумает нечто оригинальное, связанное с Ruby, как например: </p>
<p>&#8220;Ruby - друг человека&#8221;</p>
<p>&#8220;Ruby, коси и забивай&#8221;</p>
<p>Со спины, футболка будет выглядеть примерно так:</p>
<p><img src="/files/2010/11/d184d183d182d0b1d0bed0bbd0bad0b0.gif" style="margin-top:10px;width:100px"></p>
]]></content:encoded>
			<wfw:commentRss>http://flatsoft.com/2010/11/22/fletsoft-odevaet/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Курсы. День 6</title>
		<link>http://flatsoft.com/2010/11/12/kursyi-den-6/</link>
		<comments>http://flatsoft.com/2010/11/12/kursyi-den-6/#comments</comments>
		<pubDate>Fri, 12 Nov 2010 16:31:07 +0000</pubDate>
		<dc:creator>leoniddinershtein</dc:creator>
		
		<category><![CDATA[RubyOnRails]]></category>

		<category><![CDATA[School]]></category>

		<guid isPermaLink="false">http://flatsoft.com/?p=615</guid>
		<description><![CDATA[Занятие 6. Синтаксис ruby и базовые вещи
Конспект Евгения.
0) запуск из консоли.
1) переменные
2) основные классы
3) методы. определение и вызов.
4) rubykoans

Ру́би — интерпретируемый язык программирования высокого уровня. Обладает независимой от операционной системы реализацией многопоточности, строгой динамической типизацией, «сборщиком мусора» и многими другими возможностями, поддерживающими много разных парадигм программирования, прежде всего классово-объектную.
( http://ru.wikibooks.org/wiki/Ruby )
Запуск
Для руби существуюет интерактивная консоль [...]]]></description>
			<content:encoded><![CDATA[<p>Занятие 6. Синтаксис ruby и базовые вещи<br />
Конспект Евгения.</p>
<p>0) запуск из консоли.<br />
1) переменные<br />
2) основные классы<br />
3) методы. определение и вызов.<br />
4) rubykoans</p>
<p><span id="more-615"></span></p>
<p>Ру́би — интерпретируемый язык программирования высокого уровня. Обладает независимой от операционной системы реализацией многопоточности, строгой динамической типизацией, «сборщиком мусора» и многими другими возможностями, поддерживающими много разных парадигм программирования, прежде всего классово-объектную.</p>
<p>( http://ru.wikibooks.org/wiki/Ruby )</p>
<p>Запуск<br />
Для руби существуюет интерактивная консоль irb - очень похожа на консоль из rails ( rails console), но без многих встроенных в рельсы библиотек. Удобно если надо протестировать небольшой кусок кода или отдельные выражения. Запуск из консоли ( shell или cmd) : irb. </p>
<p>Файлы программ на ruby имеют расширение *.rb. Что бы запустить программу, надо выполнить комадну ruby file.rb, где file.rb - имя программы. для *nix систем существует возможность сделать программу исполняемой. для этого необходимо в самом начале программы указать интерепретатор &#8220;#!/usr/bin/env ruby&#8221; или &#8220;#!/usr/bin/ruby&#8221;, а потом дать права файлу на исполнение &#8220;chmod u+x ./file.rb&#8221;. после этого программу можно запускать как обычный выполняемый скприпт /path/to/file.rb</p>
<p>Вывод на экран</p>
<p>В Ruby есть много методов вывода: print, printf, p, puts, .display и другие.<br />
* метод puts. После вывода строки осуществляет переход на новую. Если приходится выводить объект, не являющийся строкой, то puts вызывает метод .to_s для преобразования его к строке;<br />
* метод p. Имеет самое короткое название, из-за чего часто используется для отладки. Так же, как и puts, делает перевод на новую строку после вывода. Перед выводом любого объекта (в том числе и строки) на экран, вызывает метод .inspect.<br />
* метод print. Выводит на экран без перевода каретки, в остальном аналогичен методу puts</p>
<p>Примеры вывода на экран:<br />
puts [1, 2, 3, 4]    #=&gt; 1n2n3n4  n означает перевод строки<br />
p [1, 2, 3, 4]       #=&gt; [1, 2, 3, 4]<br />
puts &#8220;Hello!&#8221;        #=&gt; Hello!<br />
p &#8220;Hello!&#8221;           #=&gt; &#8220;Hello!&#8221;<br />
puts 5               #=&gt; 5</p>
<p>В руби существует два способа комментирования текста # - закомментирует все до конца строки, многострочный комментарий отмечается как<br />
=begin ( обязательно с начала строки)<br />
=end</p>
<p>Переменные.<br />
В ruby приняты следующие способы именования переменных:<br />
variable_name<br />
variable_2<br />
ClassName<br />
ModuleName<br />
CONSTANT</p>
<p>в руби переменная объявляется при первом присвоении ей значения. переменные класс ( содержат @ в начале имени - @variable_name ) объявляются при первом их упоминании, и содержат nil по умолчанию. Все переменные указывают на объект. Стандартные объекты nil, true, false - тоже являются объектами ( уточнить класс можно через variable.class )</p>
<p>Базовые классы руби.<br />
Целые числа<br />
Целые числа в Ruby не ограничены по величине, то есть могут хранить сколь угодно большие значения. Для обеспечения такого волшебного свойства было создано два класса. Один из них хранит числа меньшие 230 (по модулю), а второй — всё, что больше. По сути, для больших чисел создаётся массив из маленьких, а раз массив не имеет ограничений по длине, то и число получается неограниченным по значению. К сожалению, эти ограничения налагаются используемой базой данных - впрочем, можно хранить числа как строки.</p>
<p>Числа с плавающей запятой<br />
Числа с плавающей запятой задаются только в десятичной системе счисления, при этом для отделения дробной части используется символ . (точка). Для задания чисел с плавающей запятой может быть применена и экспоненциальная форма записи: два различных представления 0.1234e2 и 1234e-2 задают одно и тоже число 12.34.</p>
<p>Арифметические операции в Ruby обычны: сложение (+), вычитание (-), умножение (*), деление (/), получение остатка от деления (%), возведение в степень (**). Если все аргументы арифметического выражения целые числа, то результат будет целым, если хотя бы одно число с плавающей запятой, то результат будет числом с плавающей запятой.</p>
<p>Строка.<br />
Строка — это упорядоченная последовательность символов, которая располагается между ограничительными символами.<br />
Строковый тип является самым популярным в любом языке программирования. Ведь без него невозможно написать любую программу (особенно учитывая, что любая программа — это строка). При выводе на экран или записи в файл, любой тип данных преобразуется к строке (явно или неявно). Это значит, что в конечном итоге всё сводится к строковому типу. Кстати, и ввод данных тоже осуществляется в виде строки (и только потом преобразуется в другие типы).</p>
<p>Способы создания строки<br />
Строка создаётся при помощи ограничительных символов. Для этих целей чаще всего используются &#8221; (программистская кавычка) и &#8216; (машинописный апостроф). Их смысл различен. Строка в апострофах гарантирует, что в ней будет содержаться тот же текст, что и в коде программы, без изменений. Строка в кавычках будет проходить предварительное преобразование. Внутри строки с &#8221; можно использовать спец символы , экранируя их , и вставку кода руби - через &#8220;hello, #{user.name}&#8221;. внутри строки &#8216; нельзя использовать спец символы и #{}.</p>
<p>Массивы.<br />
Массив создаётся как минимум трёмя способами. Первый способ:<br />
[1, 2, 3, 4, 5, 6]<br />
Вы просто перечисляете элементы массива через запятую, а границы массива обозначаете квадратными скобками. С таким методом создания массива мы уже встречались. А теперь попробуем второй способ, через вызов метода .new класса Array:<br />
Array.new(6){ |index| index + 1 }    #=&gt; [1, 2, 3, 4, 5, 6]<br />
Параметром метода .new является количество элементов будущего массива (в данном случае это число 6). В фигурных скобках указано, как мы будем заполнять массив. В данном случае значение элемента массива будет больше на единицу его индекса. Третий способ заключается в создании объекта типа Range (диапазон) и вызове метода .to_a:<br />
(1..6).to_a    #=&gt; [1, 2, 3, 4, 5, 6]<br />
Класс Array содержит обширную библиотеку методов. Итераторы, логические методы, работа с каждым элементом или работа со всем массивом в целом.  Наиболее часто используются методы .each - проходит по всем элементам массива и выполняет некоторую операцию. и метод map ( collect ) - выполняет некоторый код с каждым элементом и возвращает новый массив, состоящий из результатов работы каждого блока.<br />
 [1,2,3,4,5].map{|element| element * element} # =&gt; [1,4,9,16,25]</p>
<p>Различают два типа массивов: индексные, у которых в качестве индекса только целое число и ассоциативные, где индексом может быть любой объект.<br />
Хеши можно представить как массив пар: ключ=&gt;значение. Но в отличие от массива, хеш неупорядочен: нельзя заранее сказать, какая пара будет первой, а какая последней. Правда, удобство использования массива это шибко не умаляет. Более того, поскольку в Ruby переменные не типизированы и методам с похожей функциональностью дают похожие имена, то использование хеша чаще всего равносильно использованию массива.<br />
Хеш обозначается как {}.<br />
{&#8221;март&#8221;=&gt;400, &#8220;январь&#8221;=&gt;350, &#8220;февраль&#8221;=&gt;200}</p>
<p>методы.<br />
Все функции в Ruby являются методами, то есть свойственны обьектам. При программировании на это можно не обращать внимания, поскольку любая программа на Ruby уже является определением класса. У методов могут быть обязательные или необязательные параметры. Методы разграничиваются фигурными скобками или ключевыми словами def и end.</p>
<p>def method_name(firstname, nickname = &#8216;undefined&#8217;, options = {})<br />
Определения говорит о том что аргумент метода имеет базовое значение &#8216;undefined&#8217;, а аргумент options имеет значение по умолчанию - пустой хеш. данный метод можно вызвать следующими способомаи<br />
  * method_name &#8216;code&#8217; # передаем одно значение, остальные будут использоваться дефолтовые.<br />
  * method_name(&#8217;code&#8217;) # то же самое, скобки желательно использовать для улучшения читабельности<br />
  * method_name &#8216;code&#8217;, &#8216;anonimous&#8217;<br />
  * method_name &#8216;code&#8217;, &#8216;anonimous&#8217;, :as_troll =&gt; true<br />
  * method_name(&#8217;code&#8217;, &#8216;anonimous&#8217;, { :as_troll =&gt; true })</p>
]]></content:encoded>
			<wfw:commentRss>http://flatsoft.com/2010/11/12/kursyi-den-6/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Курсы. День 5</title>
		<link>http://flatsoft.com/2010/11/04/kursyi-den-5/</link>
		<comments>http://flatsoft.com/2010/11/04/kursyi-den-5/#comments</comments>
		<pubDate>Wed, 03 Nov 2010 20:07:16 +0000</pubDate>
		<dc:creator>leoniddinershtein</dc:creator>
		
		<category><![CDATA[RubyOnRails]]></category>

		<guid isPermaLink="false">http://flatsoft.com/?p=610</guid>
		<description><![CDATA[К пятому дню курсов мы уже имели приложение, которое умело что-то делать.
А именно мы создали модели продукт и категория, админку для управления категориями и продуктами.
Наш код был под контролем версий Git.
Результат работы находится на Github &#8212; https://github.com/evgeniypetrov/seminar4shop
Прочитайте Readme, чтобы повторить ход работы.
5 день изучения Ruby on Rails был посвящен хорошим практикам работы с git и [...]]]></description>
			<content:encoded><![CDATA[<p>К пятому дню курсов мы уже имели приложение, которое умело что-то делать.<br />
А именно мы создали модели продукт и категория, админку для управления категориями и продуктами.<br />
Наш код был под контролем версий Git.</p>
<p>Результат работы находится на Github &#8212; https://github.com/evgeniypetrov/seminar4shop</p>
<p>Прочитайте <a href="https://github.com/evgeniypetrov/seminar4shop/blob/master/README">Readme</a>, чтобы повторить ход работы.</p>
<p>5 день изучения Ruby on Rails был посвящен хорошим практикам работы с git и улучшением нашего магазина.</p>
<p>Cегодня мы вели нашу разработку в отдельной ветке, создали главную страницу магазина, разобрались с отображением (Layouts, partial, view), сделали контроллер для продуктов. В конце разработки, мы соединили мастер ветку с новой веткой, разрешили конфликты.<br />
<span id="more-610"></span><br />
Приведу здесь некоторые ссылки:</p>
<p>Полезно прочитать про git:<br />
1. <a href="http://habrahabr.ru/blogs/Git/60030/">Git Workflow</a><br />
2.<a href="http://habrahabr.ru/blogs/Git/60347/"> Git Wizardry </a><br />
3. <a href="http://nvie.com/posts/a-successful-git-branching-model/">A successful Git branching model</a><br />
4. http://book.git-scm.com/  главу Intermediate Usag</p>
<p>По отображению в Ruby on Rails:<br />
http://guides.rubyonrails.org/layouts_and_rendering.html</p>
<p>Дома вам необходимо сделать так, чтоб на главной странице отображались только товары, которые есть в наличие. (Использовать scope)<br />
Добавить ссылки на категории и сделать так, чтобы при переходе в категорию, отображались только те товары, которые в ней находятся.<br />
Ну и попробуйте сделать наше оформление более красивым :) Сделайте layout для главной страницы и продуктов отдельные.</p>
<p>Код держите на github и делитесь друг с другом ссылками в комментариях.</p>
]]></content:encoded>
			<wfw:commentRss>http://flatsoft.com/2010/11/04/kursyi-den-5/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Краткий отчет с баркампа</title>
		<link>http://flatsoft.com/2010/11/02/kratkiy-otchet-s-barkampa/</link>
		<comments>http://flatsoft.com/2010/11/02/kratkiy-otchet-s-barkampa/#comments</comments>
		<pubDate>Tue, 02 Nov 2010 10:58:56 +0000</pubDate>
		<dc:creator>Tatyana Vyruchaeva</dc:creator>
		
		<category><![CDATA[Events]]></category>

		<category><![CDATA[флэтсофт]]></category>

		<category><![CDATA[фотографии]]></category>

		<guid isPermaLink="false">http://flatsoft.com/?p=600</guid>
		<description><![CDATA[Спасибо всем, кто не смотря ни на что пришел в прошедшее воскресенье к нам на баркамп! По-моему была вполне милая и дружественная атмосфера :) В общей сложности присутствовало 20 человек, к сожалению, не всех удалось послушать, но в данном случае, главное - участие.
Вот основные темы, которые были рассмотрены:

Интегрирование капчи в rails3 приложение (что бы пользователь [...]]]></description>
			<content:encoded><![CDATA[<p>Спасибо всем, кто не смотря ни на что пришел в прошедшее воскресенье к нам на баркамп! По-моему была вполне милая и дружественная атмосфера :) В общей сложности присутствовало 20 человек, к сожалению, не всех удалось послушать, но в данном случае, главное - участие.</p>
<p>Вот основные темы, которые были рассмотрены:</p>
<ul>
<li>Интегрирование <a href="http://ru.wikipedia.org/wiki/Captcha">капчи</a> в rails3 приложение (что бы пользователь при регистрации вводил текст с картинки). За основу взято приложение <a href="http://github.com/fs/rails3-base">rails3-base</a> в котором в качестве решения для аутентификации используется гем devise</li>
<li>HTML5, Drag and drop файлов между браузером и ОС.</li>
<li><a href="http://flatsoft.com/2010/11/01/mysql-replications/">MySQL replications</a></li>
<li>Применение rvm, rspec+shoulda для тестирования моделей, cucumber, formtastic, tebletastic, flutie, devise;</li>
<li>Что такое scrumboard. Органиция работы с помощью утилиты screen.</li>
</ul>
<p>Кроме озвученных выше пунктов, мы замечательно пообщались и на множество других, интересных для нас тем.</p>
<p>Было бы здорово услышать отзывы тех, кто приходил к нам впервые! Может у вас есть предложения, какие темы хотелось бы рассмотреть в следующий раз?</p>
<p>Ждем ваших предложений! Будем рады комментариям!</p>
<p style="text-align: center"><a href="http://www.flickr.com/photos/flatsoft/5139558058/"><img src="http://farm5.static.flickr.com/4051/5139558058_dc7d056c28_s.jpg" alt="" width="75" height="75" /></a> <a href="http://www.flickr.com/photos/flatsoft/5138953249/"><img src="http://farm5.static.flickr.com/4108/5138953249_c687a5a7de_s.jpg" alt="" width="75" height="75" /></a> <a href="http://www.flickr.com/photos/flatsoft/5139557398/"><img src="http://farm2.static.flickr.com/1128/5139557398_86b1bf0392_s.jpg" alt="" width="75" height="75" /></a> <a href="http://www.flickr.com/photos/flatsoft/5138952673/"><img src="http://farm2.static.flickr.com/1360/5138952673_bcb3232497_s.jpg" alt="" width="75" height="75" /></a> <a href="http://www.flickr.com/photos/flatsoft/5139556894/"><img src="http://farm5.static.flickr.com/4069/5139556894_8492679643_s.jpg" alt="" width="75" height="75" /></a> <a href="http://www.flickr.com/photos/flatsoft/5138952099/"><img src="http://farm5.static.flickr.com/4070/5138952099_79296113a7_s.jpg" alt="" width="75" height="75" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://flatsoft.com/2010/11/02/kratkiy-otchet-s-barkampa/feed/</wfw:commentRss>
		</item>
		<item>
		<title>MySQL replications</title>
		<link>http://flatsoft.com/2010/11/01/mysql-replications/</link>
		<comments>http://flatsoft.com/2010/11/01/mysql-replications/#comments</comments>
		<pubDate>Mon, 01 Nov 2010 08:36:59 +0000</pubDate>
		<dc:creator>pesoshin</dc:creator>
		
		<category><![CDATA[General]]></category>

		<guid isPermaLink="false">http://flatsoft.com/?p=593</guid>
		<description><![CDATA[Всем привет!
Вчера на баркампе я обещал выложить краткий конспект своего доклада по теме &#8220;Масштабирование БД: репликации в MySQL&#8221;.
В своем докладе в плане теории я опирался на следующие скринкасты, очень рекомендую вам их посмотреть:

http://railslab.newrelic.com/2009/07/16/episode-17-scaling-your-database-part-1
http://railslab.newrelic.com/2009/07/24/episode-18-scaling-your-database-part-2
http://railslab.newrelic.com/2009/02/19/episode-9-taylor-weibley-databases


Для того, чтобы настроить репликации в MySQL по самой распространенной схеме Master/Slave, есть замечательные гайды на официальном сайте MySQL и на сайте cowboycoded.com

http://dev.mysql.com/doc/refman/5.0/en/replication-howto.html
http://www.cowboycoded.com/2009/08/19/mysql-master-slave-replication-tutorial/

Адекватного [...]]]></description>
			<content:encoded><![CDATA[<p>Всем привет!</p>
<p>Вчера на баркампе я обещал выложить краткий конспект своего доклада по теме &#8220;Масштабирование БД: репликации в MySQL&#8221;.</p>
<p>В своем докладе в плане теории я опирался на следующие скринкасты, очень рекомендую вам их посмотреть:</p>
<ul>
<li><a href="http://railslab.newrelic.com/2009/07/16/episode-17-scaling-your-database-part-1">http://railslab.newrelic.com/2009/07/16/episode-17-scaling-your-database-part-1</a></li>
<li><a href="http://railslab.newrelic.com/2009/07/24/episode-18-scaling-your-database-part-2">http://railslab.newrelic.com/2009/07/24/episode-18-scaling-your-database-part-2</a></li>
<li><a href="http://railslab.newrelic.com/2009/02/19/episode-9-taylor-weibley-databases">http://railslab.newrelic.com/2009/02/19/episode-9-taylor-weibley-databases</a></li>
</ul>
<p><a href="http://"></a></p>
<p>Для того, чтобы настроить репликации в MySQL по самой распространенной схеме Master/Slave, есть замечательные гайды на официальном сайте MySQL и на сайте <strong>cowboycoded.com</strong></p>
<ul>
<li><a href="http://dev.mysql.com/doc/refman/5.0/en/replication-howto.html">http://dev.mysql.com/doc/refman/5.0/en/replication-howto.html</a></li>
<li><a href="http://www.cowboycoded.com/2009/08/19/mysql-master-slave-replication-tutorial/">http://www.cowboycoded.com/2009/08/19/mysql-master-slave-replication-tutorial/</a></li>
</ul>
<p>Адекватного решения этой задачи &#8220;из коробки&#8221; для <strong>Rails 3</strong> пока не нашлось. Предлагаю обратить внимание на существующие решения для вторых рельсов, попробовать их и, возможно, помочь в поиске (или создании) решения для третьих рельсов.</p>
<ul>
<li><a href="http://github.com/technoweenie/masochism">http://github.com/technoweenie/masochism</a></li>
<li><a href="http://github.com/mauricio/master_slave_adapter">http://github.com/mauricio/master_slave_adapter</a></li>
</ul>
<p><a href="http://"></a></p>
]]></content:encoded>
			<wfw:commentRss>http://flatsoft.com/2010/11/01/mysql-replications/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Курсы. День 3</title>
		<link>http://flatsoft.com/2010/10/27/kursyi-den-3/</link>
		<comments>http://flatsoft.com/2010/10/27/kursyi-den-3/#comments</comments>
		<pubDate>Wed, 27 Oct 2010 19:51:44 +0000</pubDate>
		<dc:creator>leoniddinershtein</dc:creator>
		
		<category><![CDATA[RubyOnRails]]></category>

		<category><![CDATA[School]]></category>

		<guid isPermaLink="false">http://flatsoft.com/?p=579</guid>
		<description><![CDATA[Всем привет!
Итак, закончился 3 день изучения Ruby on Rails.
Мы прошли следующие темы:

Git базовые навыки: init, add, commit
Создание модели “Категория”
Связи между моделями
Миграции
Валидация


Конспектирую здесь, что необходимо повторить.
1.  Git

Рекомендую прочитать The Git Community Book, как минимум главу &#8220;3. Basic Usage&#8221;.
И посмотрите главу про Git из Ruby on Rails Tutorial
Будет здорово, если Вы зарегистрируетесь на github.com и будете [...]]]></description>
			<content:encoded><![CDATA[<p>Всем привет!</p>
<p>Итак, закончился 3 день изучения Ruby on Rails.</p>
<p>Мы прошли следующие темы:</p>
<ul>
<li>Git базовые навыки: init, add, commit</li>
<li>Создание модели “Категория”</li>
<li>Связи между моделями</li>
<li>Миграции</li>
<li>Валидация</li>
</ul>
<p><span id="more-579"></span></p>
<p>Конспектирую здесь, что необходимо повторить.</p>
<p><strong>1.  Git</strong><br />
<script src="http://gist.github.com/650589.js?file=git.bash"></script></p>
<p>Рекомендую прочитать <a href="http://book.git-scm.com/">The Git Community Book</a>, как минимум главу &#8220;3. Basic Usage&#8221;.<br />
И посмотрите главу про Git из <a href="http://railstutorial.org/book#sec:version_control">Ruby on Rails Tutorial</a></p>
<p>Будет здорово, если Вы зарегистрируетесь на <a href="http://github.com">github.com</a> и будете держать свой проект там.</p>
<p>Для удобства работы, привожу алиасы<br />
<script src='http://pastie.org/1254876.js'></script><br />
Пропишите их в ~/.bashrc</p>
<p>Еще будет очень удобно, если в консоле будет указано в какой ветке вы в данный момент находитесь.<br />
Для этого в .bashrc надо добавить<br />
<script src='http://pastie.org/1254888.js'></script></p>
<p><strong>2. Связи между моделями</strong></p>
<p>Необходимо прочитать <a href="http://guides.rubyonrails.org/association_basics.html">Rails Guides </a>.</p>
<p>Самим указать в нашем учебном проекте, что product belongs_to category, category has_many products и т.д.</p>
<p>Попробуйте придумать свои примеры, чтобы отработать все типы ассоциаций.</p>
<p>Если останутся силы, посмотрите <a href="http://railscasts.com/episodes/154-polymorphic-association">polymorphic-association</a>.</p>
<p>Включите отображение SQL запросов в консоле.<br />
Введите в консоле: ActiveRecord::Base.logger = Logger.new(STDOUT)</p>
<p>Посмотрите, какие запросы выполняются.</p>
<p><strong>3. Валидация</strong></p>
<p>Опять же отправляю вас к <a href="http://guides.rubyonrails.org/active_record_validations_callbacks.html">Ruby Guides</a>.</p>
<p>Сделайте проверку, что у продукта есть имя, положительная цена, что у категории есть имя, что оно уникальное и т.д.</p>
<p>Я еще обещал рассказать почему у нас не получилось сделать<br />
1. has_one :something, :after_add =&gt; :some_method<br />
2. Рассказать про Lazy Loading</p>
<p>И я забыл рассказать вам про <a href="http://flatsoft.com/2010/10/25/vse-na-barcamp/">Баркамп</a>.<br />
Напишите, пожалуйста, в комментариях кто планирует прийти.</p>
]]></content:encoded>
			<wfw:commentRss>http://flatsoft.com/2010/10/27/kursyi-den-3/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Курсы. День 2</title>
		<link>http://flatsoft.com/2010/10/25/kursyi-den-2/</link>
		<comments>http://flatsoft.com/2010/10/25/kursyi-den-2/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 19:59:14 +0000</pubDate>
		<dc:creator>pesoshin</dc:creator>
		
		<category><![CDATA[RubyOnRails]]></category>

		<category><![CDATA[School]]></category>

		<guid isPermaLink="false">http://flatsoft.com/?p=559</guid>
		<description><![CDATA[Всем привет!
Прошел второй день курсов Ruby on Rails. Несмотря на то, что занятие получилось слегка сумбурным - много информации, привыкание к окружению разработки, маленькие технические неувязки и т.д., мы все же подготовили конспект  и сейчас представим ее вам.

1. Создание нового рельсового приложения
rails new project_path
Настройки соединия с базой данных хранятся в config/database.yml. Нетбинс бывает переписывает данный [...]]]></description>
			<content:encoded><![CDATA[<p>Всем привет!</p>
<p>Прошел второй день курсов Ruby on Rails. Несмотря на то, что занятие получилось слегка сумбурным - много информации, привыкание к окружению разработки, маленькие технические неувязки и т.д., мы все же подготовили конспект  и сейчас представим ее вам.</p>
<p><span id="more-559"></span></p>
<p><strong>1. Создание нового рельсового приложения</strong></p>
<p>rails new project_path<br />
Настройки соединия с базой данных хранятся в config/database.yml. Нетбинс бывает переписывает данный файл. В общем, часть development должна выглядеть примерно так.<br />
development:<br />
adapter: sqlite3<br />
database: db/development.sqlite3<br />
pool: 5<br />
timeout: 5000</p>
<p>В составе rails по умолчанию есть много разных полезных фичей.</p>
<p><strong>2. Генераторы кода</strong></p>
<p>для просмотра всех наберите rails generate, или rails generate *generator* для просмотра помощи по конкретному генератору. Рассмотренные на занятии генераторы</p>
<p><code>rails generate model<br />
rails generate migration<br />
rails generate scaffold<br />
</code></p>
<p><strong>3. rake - таски. </strong></p>
<p>Rake - аналог make, только на ruby.<br />
для просмотра всех тасков необходимо выполнитть<em> rake -T</em> или <em>rake -T [ключевое слово]</em>. На занятии использовались следующие таски.</p>
<p><code>rake db:migrate<br />
rake db:rollback<br />
rake db:migrate VERSION=version<br />
rake db:seed</code></p>
<p><strong>4. Model</strong></p>
<p>Рельсы используют ActiveRecord для работы с базой. AR  отображает состояние таблицы, поэтому для добавления или удаления полей из класса наследованного от AR необходимо менять саму таблицу в базе данных. Для этого в рельсах есть миграции.<br />
[вставить картинку отображения схемы работы AR]</p>
<p><strong>5. Migration.</strong></p>
<p>Миграции, это классы наследованные от ActiveRecord::Migration. Миграция должны содержать два основных метода ( методы класса) - up / down. Метод up выполняет нужные изменения в базе данных - метод down производит откат изменений сделанных методом up при &#8220;откате&#8221; - rollback миграции. Все изменения в базе должны делаться через миграции.<br />
Команда<br />
rails generate model Product name:string price:integer<br />
создаст нам модель Product ( местонахождение app/models/product ) и миграцию create_products cледующего вида.</p>
<p><code>class CreateProducts &lt; ActiveRecord::Migration<br />
def self.up<br />
create_table :products do |t|<br />
t.string :name<br />
t.integer :price</code></p>
<p><code>t.timestamps<br />
end<br />
end</code></p>
<p><code>def self.down<br />
drop_table :products<br />
end<br />
end</code></p>
<p>метод create_table  создает таблицу. через переменную t мы задаем поля этой таблицы. кроме create_table, существуют подобные методы drop_table и change_table.<br />
Формат задания полей. Миграции понимают следующие типа полей<br />
:primary_key, :string, :text, :integer, :float, :decimal, :datetime, :timestamp, :time, :date, :binary, :boolean.</p>
<p>следующие способы записи равносильны<br />
t.column :name, :string<br />
t.string :name<br />
разница в том что t.string может создать сразу несколько полей<br />
t.string :name, :title, :first_name, :short_description</p>
<p>строка t.timestamps равносильна следующему<br />
<code>t.column  :created_at, :datetime<br />
t.column  :updated_at, :datetime</code></p>
<p>Для создание отдельной миграции, добавляющей ссылку на модель Category, необходимо выполнить следующую комаднду<br />
rails generate migration add_category_to_products category:string.<br />
Формат имени говорит рельсам что мы хотим создать миграцию для добавления (add) поля category в таблицу products. category:string задает тип этого поля. Впрочем, ничего не мешат создать миграцию с произвольным именем, а потом руками добавить следующие строки.</p>
<p><code>def self.up<br />
add_column :products, :category, :string<br />
end</code></p>
<p><code>def self.down<br />
remove_column :products, :category<br />
end</code></p>
<p>вместо add_column можно использовать конструкцию<br />
<code>change_table :products do |t|<br />
t.string :category<br />
end</code><br />
а вместо remove_column<br />
<code>change_table :products do |t|<br />
t.remove :category<br />
end</code></p>
<p>полный список методов миграции.<br />
* create_table<br />
* change_table<br />
* drop_table<br />
* add_column<br />
* change_column<br />
* change_column_default<br />
* rename_column<br />
* remove_column<br />
* add_index<br />
* remove_index</p>
<p>что бы запустить миграцию необходимо выполнить команду rake db:migrate<br />
что бы откатить - rake db:rollback ( откатится последний мигрейт ). Команда redo сначала откатит, а потом снова накатит мигрейт. Полезно бывает проверить откатываемость миграции.<br />
<code>rake db:migrate<br />
rake db:migrate:rollback<br />
rake db:migrate:redo<br />
rake db:migrate:rollback STEP=3<br />
rake db:migrate:redo STEP=3<br />
rake db:migrate:up VERSION=xxxxxxxxxxxxx<br />
rake db:migrate:down VERSION=xxxxxxxxxxxx</code></p>
<p>с параметром VERSION rake db:migrate прогонит миграции до указанной версии, с указанием направления - только в указанном.<br />
параметр STEP задает количество миграций.Так например rake db:migrate:redo STEP=3 откатит последние три миграции, а потом накатит их в обратном порядке.</p>
<p><strong>6. Работа с данными. </strong></p>
<p>После создания таблица не содержит записей ( проверить можно выполнив Product.count в  rails консоли ). Создать новые записи можно как вручную через консоль, так и через rake db:seed. Данный таск предназначен для первоначального заполнения таблицы данными, при его запуске он выполняет код из db:seed. Пускай он выглядит примерно так<br />
<code>db/seed.rb<br />
product = Product.new<br />
product.name = 'red ball'<br />
product.price = 10<br />
product.save</code></p>
<p><code>product1 = Product.new(:name =&gt; 'yellow ball', :price =&gt; 15)<br />
product1.save</code></p>
<p><code>product2 = Product.create(:name =&gt; 'blue ball', :price =&gt; 20)</code></p>
<p><code># and create many other products<br />
Product.create(:name =&gt; 'blue ball', :price =&gt; 10)<br />
Product.create(:name =&gt; 'blue ball', :price =&gt; 15)</code></p>
<p><code>Product.create(:name =&gt; 'red ball', :price =&gt; 25)<br />
Product.create(:name =&gt; 'green ball', :price =&gt; 15)</code></p>
<p>После выполнения rake db:seed у нас в базе будет 7 записей о товарах.<br />
Особо отмечу, что после выполнения Product.new(:name =&gt; &#8216;ball&#8217;, :price =&gt; 10) строка в таблице не создается! Запись будет создана только после того  как вы вызовете метод save или save!.</p>
<p><strong>7. Основы работы с моделями.</strong></p>
<p>Для поиска продукта по известному ключу надо выполнить Product.find(primary_key) - где primary_key - первичный ключ, в нашем случае это id объекта.<br />
кроме этого, есть методы Product.first - вернет первый объект в таблице и Product.last - последний. Эти методы принимают в качестве аргумента количество объектов которых надо вренуть. к примеру, Product.last(5) вернет последние 5 записей. метод Product.all вернет все записи из таблицы.</p>
<p>для поиска объектов можно использовать метод where. его можно использовать в следующие вариантах<br />
Product.where(&#8221;name = &#8216;blue ball&#8217;&#8221;) - не очень красивый вариант, этот код не будет заэскейплен и будет напрямую выполнени.<br />
Product.where(:name =&gt; &#8216;blue ball&#8217;) - в этом случае рельсы возьмут на себя проверку содержания переменной.<br />
Product.where(&#8221;name = ?&#8221;, &#8216;blue ball&#8217;) - совмещенный вариант<br />
Product.where(&#8221;name = :name or title = :name or some_field = :name&#8221;, :name =&gt; &#8216;blue ball&#8217;) -  вариант используется если в условии надо испольовать одну переменную несколько раз.</p>
<p>Рельсы так же позволяют использвать диапазоны значений.<br />
Product.where(:price =&gt; [10, 15]) - продукты с ценой 10 или 15<br />
Product.where(:price =&gt; (10..15)) - продукты с ценой от 10 до 15. Использовать следует с осторожностью, поскольку sql код будет выглядить как where price in (10, 11, 12, 13, 14, 15).  Если задать диапазон как  (1.year.ago..1.year.from_now) можно получить запрос где будут перечислены ВСЕ возможные даты за два года.</p>
<p>Помимо этого, есть методы<br />
select(:name) для выборки только имен продуктов ну или любых полей какие захотите<br />
order(&#8221;price desc&#8221;) - для задания порядка продуктов - обычный sql порядок, можно использовать несколько &#8220;price desc, name asc, created_at desc&#8221;<br />
limit(5) - для задания количества элементов. можно 5, можно 100<br />
offset - для задания сдвига. к примеру offset(2) пропустит первые два найденные элемента<br />
group(name) - группировка по имени. все понятно</p>
<p>Product.group(:name).select(&#8221;avg(price) as avg_price, name&#8221;).order(:name).offset(1).limit(1)<br />
найдет среднюю цену зеленого шара. просто пример как комбинировать, особого смысла нет)</p>
<p><strong>Приложение 1. Необходимые линуксовые команды</strong></p>
<p>mkdir cat_name - создание каталога<br />
ls path - список элементов<br />
cd path - Change Directory смена каталога</p>
<p>info - выдаст содержание справки.</p>
<p>Всем удачи!</p>
<p>PS. Для заинтересованных, приходите с большими флешками - можем скинуть настроенный образ <strong>railsdev</strong> на CentOS&#8217;е. Как разработчикам - очень пригодится</p>
]]></content:encoded>
			<wfw:commentRss>http://flatsoft.com/2010/10/25/kursyi-den-2/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>

