<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2russianfull.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>RubyFlow.ru</title>
    <description>Коллективный блог сообщества разработчиков, использующих Ruby</description>
    <link>http://rubyflow.ru/items</link>
    <language>ru-ru</language>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/rubyflowru" /><feedburner:info uri="rubyflowru" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><creativeCommons:license>http://creativecommons.org/licenses/by-nc-nd/3.0/</creativeCommons:license><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Ffeeds.feedburner.com%2Frubyflowru" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Frubyflowru" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Ffeeds.feedburner.com%2Frubyflowru" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://feeds.feedburner.com/rubyflowru" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Ffeeds.feedburner.com%2Frubyflowru" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Ffeeds.feedburner.com%2Frubyflowru" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Ffeeds.feedburner.com%2Frubyflowru" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><feedburner:feedFlare href="http://lenta.yandex.ru/settings.xml?name=feed&amp;url=http%3A%2F%2Ffeeds.feedburner.com%2Frubyflowru" src="http://lenta.yandex.ru/i/addfeed.gif">?????? ? ??????.?????</feedburner:feedFlare><item>
      <title>Интроспекция цепочки вызова методов ActiveRecord::Base</title>
      <description>&lt;p&gt;Недавно захотелось разобраться, какие методы вызываются при вызове конкретного метода отнаследованного от ActiveRecord::Base класса.&lt;/p&gt;

&lt;p&gt;Поэтому я придумал небольшой хак для вывода названия метода при его вызове:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;module ActiveRecord
  Base.singleton_methods.each do |m|
    Base.class_eval &amp;lt;&amp;lt;-EOS
      class &amp;lt;&amp;lt; self
        puts "redefining #{m}"

        define_method "#{m}_with_introspection" do |*args|
          puts "#{m}"
          send(:"#{m}_without_introspection", *args)
        end

        alias_method :"#{m}_without_introspection", :"#{m}"
        alias_method :"#{m}", :"#{m}_with_introspection"
      end
    EOS
  end
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;a href="https://gist.github.com/2828416"&gt;https://gist.github.com/2828416&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Можно подключить этот код через какой-нибудь init.rb/environment.rb файл, чтобы он загружался при старте проекта или можно просто запускать его руками из irb сессии.&lt;/p&gt;

&lt;p&gt;Вот пример использования в irb: &lt;a href="https://gist.github.com/2828602"&gt;https://gist.github.com/2828602&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;NB: Можно применять этот хак не только для класса ActiveRecord::Base, но и для всех классов/модулей со сложной структурой вызовов метода.&lt;/p&gt;

&lt;p&gt;Можно легко доработать этот код не только для вывода названия метода, но и для вывода аргументов и тд.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=NAQt3k-U2fE:qp1O-T7QnKA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=NAQt3k-U2fE:qp1O-T7QnKA:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=NAQt3k-U2fE:qp1O-T7QnKA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=NAQt3k-U2fE:qp1O-T7QnKA:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?i=NAQt3k-U2fE:qp1O-T7QnKA:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rubyflowru/~4/NAQt3k-U2fE" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 29 May 2012 14:41:40 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/rubyflowru/~3/NAQt3k-U2fE/1304</link>
      <guid isPermaLink="false">http://rubyflow.ru/items/1304</guid>
    <feedburner:origLink>http://rubyflow.ru/items/1304</feedburner:origLink></item>
    <item>
      <title>Jenkins::Client</title>
      <description>&lt;p&gt;Если вы используете &lt;a href="http://jenkins-ci.org/"&gt;Jenkins&lt;/a&gt; в качестве сервера непрерывной интеграции, то Jenkins::Client может быть вам интересен.&lt;/p&gt;

&lt;p&gt;Эта библиотека предоставляет удобный интерфейс для работы с Jenkins API. Вы сможете просматривать список задач, добавлять и удалять их.&lt;/p&gt;

&lt;p&gt;Примеры кода.&lt;/p&gt;

&lt;p&gt;Инициализация:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;client = Jenkins::Client.new
client.username = "user"
client.password = "pass"
client.url = "http://jenkinsurl.com"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Получение списка задач:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;client.jobs
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Запуск задачи:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;job = Jenkins::Client::Job.new({ :name =&amp;gt; "job_name" })
job.start!
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Вы сможете узнать больше в README - &lt;a href="https://github.com/john-griffin/jenkins-client"&gt;github.com/john-griffin/jenkins-client&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=Y9jhImxHlJs:MvqlxbSCLqg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=Y9jhImxHlJs:MvqlxbSCLqg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=Y9jhImxHlJs:MvqlxbSCLqg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=Y9jhImxHlJs:MvqlxbSCLqg:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?i=Y9jhImxHlJs:MvqlxbSCLqg:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rubyflowru/~4/Y9jhImxHlJs" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 23 May 2012 05:58:03 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/rubyflowru/~3/Y9jhImxHlJs/1303</link>
      <guid isPermaLink="false">http://rubyflow.ru/items/1303</guid>
    <feedburner:origLink>http://rubyflow.ru/items/1303</feedburner:origLink></item>
    <item>
      <title>rails-brakeman.com - поиск уязвимостей онлайн</title>
      <description>&lt;p&gt;Библиотека &lt;code&gt;brakeman&lt;/code&gt; - это анализатор rails-приложений на предмет наличия в них уязвимостей.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;rails-brakeman.com&lt;/strong&gt; - это сервис, который использует эту библиотеку и предоставляет интерфейс для анализа приложений, чей код размещен на GitHub.&lt;/p&gt;

&lt;p&gt;Ссылки:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://rails-brakeman.com/"&gt;rails-brakeman.com&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;репозиторий библиотеки &lt;code&gt;brakeman&lt;/code&gt; - &lt;a href="https://github.com/presidentbeef/brakeman"&gt;github.com/presidentbeef/brakeman&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;официальный сайт &lt;code&gt;brakeman&lt;/code&gt; - &lt;a href="http://brakemanscanner.org"&gt;brakemanscanner.org&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=hFCDlCdjT_E:iGCrYlEmacw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=hFCDlCdjT_E:iGCrYlEmacw:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=hFCDlCdjT_E:iGCrYlEmacw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=hFCDlCdjT_E:iGCrYlEmacw:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?i=hFCDlCdjT_E:iGCrYlEmacw:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rubyflowru/~4/hFCDlCdjT_E" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 23 May 2012 05:52:29 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/rubyflowru/~3/hFCDlCdjT_E/1302</link>
      <guid isPermaLink="false">http://rubyflow.ru/items/1302</guid>
    <feedburner:origLink>http://rubyflow.ru/items/1302</feedburner:origLink></item>
    <item>
      <title>Sextant</title>
      <description>&lt;p&gt;&lt;strong&gt;Sextant&lt;/strong&gt; аналог команды &lt;code&gt;rake routes&lt;/code&gt;, который выводит результаты в браузере.&lt;/p&gt;

&lt;p&gt;Бывает, что в большом rails-приложении запуск rake-задачи занимает довольно много времени. Ричард Шниман (Richard Schneeman) придумал решение и реализовал его в библиотеке Sextant.&lt;/p&gt;

&lt;p&gt;Теперь увидеть все пути (routes) приложения можно открыв страницу &lt;code&gt;/rails/routes&lt;/code&gt;. Например,&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;http://localhost:3000/rails/routes
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Стоит также отметить, что адрес &lt;code&gt;/rails/routes&lt;/code&gt; доступен только development-режиме.&lt;/p&gt;

&lt;p&gt;Ссылки:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;исходный код и инструкции на GitHub - &lt;a href="https://github.com/schneems/sextant"&gt;github.com/schneems/sextant&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;вводная статья в блоге Ричарда - &lt;a href="http://schneems.com/post/23543653526/sextant-a-gem-to-help-you-find-your-routes"&gt;Sextant: A Gem to Help you Find your Routes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=Ehzm-FufrP4:ruTew1AdMdE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=Ehzm-FufrP4:ruTew1AdMdE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=Ehzm-FufrP4:ruTew1AdMdE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=Ehzm-FufrP4:ruTew1AdMdE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?i=Ehzm-FufrP4:ruTew1AdMdE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rubyflowru/~4/Ehzm-FufrP4" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 23 May 2012 05:45:21 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/rubyflowru/~3/Ehzm-FufrP4/1301</link>
      <guid isPermaLink="false">http://rubyflow.ru/items/1301</guid>
    <feedburner:origLink>http://rubyflow.ru/items/1301</feedburner:origLink></item>
    <item>
      <title>Play - музыкальный сервер от GitHub</title>
      <description>&lt;p&gt;Продолжая тему слайдов, хочу поделиться ссылкой на стопку слайдов к выступлению Зака Холмана (Zach Holman) - &lt;a href="https://speakerdeck.com/u/holman/p/stories-from-a-music-fueled-distributed-streaming-bender"&gt;"Stories From a Music-Fueled Distributed Streaming Bender"&lt;/a&gt;. Вы узнаете о проекте Play - музыкальном сервере в офисе GitHub.&lt;/p&gt;

&lt;p&gt;Просто красивые слайды, это еще не конец истории :) Код Play открыт и доступен на GitHub - &lt;a href="https://github.com/play/play/"&gt;github.com/play/play&lt;/a&gt;. Play имеет специфичные требования к окружению, но об этом подробно рассказано в README.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;P.S. Советую посмотреть и другие слайды от Зака, если вы этого еще не сделали.&lt;/em&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=yAj67cXNf_I:2_aeG5KnPpQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=yAj67cXNf_I:2_aeG5KnPpQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=yAj67cXNf_I:2_aeG5KnPpQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=yAj67cXNf_I:2_aeG5KnPpQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?i=yAj67cXNf_I:2_aeG5KnPpQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rubyflowru/~4/yAj67cXNf_I" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 19 May 2012 07:49:24 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/rubyflowru/~3/yAj67cXNf_I/1300</link>
      <guid isPermaLink="false">http://rubyflow.ru/items/1300</guid>
    <feedburner:origLink>http://rubyflow.ru/items/1300</feedburner:origLink></item>
    <item>
      <title>Слайды доклада "10 Things You Didn't Know Rails Could do" от JEG2</title>
      <description>&lt;p&gt;Прогугливаясь по просторам интернета в поисках инетересной информации, я наткнулся на доклад ruby-гуру Джеймса Эдварда Грея II. В нем собрана информация о функциональности rails, о которой вы, возможно, и не знали. Лично я для себя нашел достаточно много нового, надеюсь, вы тоже найдете... Приятного чтения!&lt;/p&gt;

&lt;p&gt;Ссылка: &lt;a href="https://speakerdeck.com/u/jeg2/p/10-things-you-didnt-know-rails-could-do"&gt;https://speakerdeck.com/u/jeg2/p/10-things-you-didnt-know-rails-could-do&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;С уважением, &lt;a href="http://twitter.com/rezwyi"&gt;@rezwyi&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=1V-n8YcdZvg:2SZq2R1Yfto:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=1V-n8YcdZvg:2SZq2R1Yfto:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=1V-n8YcdZvg:2SZq2R1Yfto:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=1V-n8YcdZvg:2SZq2R1Yfto:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?i=1V-n8YcdZvg:2SZq2R1Yfto:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rubyflowru/~4/1V-n8YcdZvg" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 18 May 2012 05:37:10 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/rubyflowru/~3/1V-n8YcdZvg/1299</link>
      <guid isPermaLink="false">http://rubyflow.ru/items/1299</guid>
    <feedburner:origLink>http://rubyflow.ru/items/1299</feedburner:origLink></item>
    <item>
      <title>"Stay young, stay curious, stay hippy..." - доклад Дэвида Хайнемайера Хенссона с конференции "RailsConf 2012"</title>
      <description>&lt;p&gt;В сети выложен видео-доклад Дэвида с конференеции "RailsConf 2012". Всем, кто еще не видел, очень советую...&lt;/p&gt;

&lt;p&gt;Молодой, знергичный, дерзкий и в то же время достаточно мудрый, он высказал свою точку зрения на прогресс в разработке программного обеспечения в целом и rails в частности.&lt;/p&gt;

&lt;p&gt;Несмотря на наличие ненормативной лексики, доклад получился очень и очень хорошим. Я получил массу удовольствия и не раз посмеялся, чего и вам желаю.&lt;/p&gt;

&lt;p&gt;Ссылка:
&lt;a href="https://www.youtube.com/watch?v=VOFTop3AMZ8"&gt;https://www.youtube.com/watch?v=VOFTop3AMZ8&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;С уважением, &lt;a href="http://twitter.com/rezwyi"&gt;@rezwyi&lt;/a&gt;.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=_Y438DSsLi4:-Qkwpd_3dyI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=_Y438DSsLi4:-Qkwpd_3dyI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=_Y438DSsLi4:-Qkwpd_3dyI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=_Y438DSsLi4:-Qkwpd_3dyI:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?i=_Y438DSsLi4:-Qkwpd_3dyI:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rubyflowru/~4/_Y438DSsLi4" height="1" width="1"/&gt;</description>
      <pubDate>Wed, 16 May 2012 17:35:42 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/rubyflowru/~3/_Y438DSsLi4/1298</link>
      <guid isPermaLink="false">http://rubyflow.ru/items/1298</guid>
    <feedburner:origLink>http://rubyflow.ru/items/1298</feedburner:origLink></item>
    <item>
      <title>Skypekit for Ruby</title>
      <description>&lt;p&gt;Skypekit для Ruby - библиотека для работы со Skype протоколом&lt;/p&gt;

&lt;p&gt;&lt;a href="http://blog.railsware.com/2012/05/11/libskypekit-and-skypekit-c-and-ruby-interface-for-skype/"&gt;http://blog.railsware.com/2012/05/11/libskypekit-and-skypekit-c-and-ruby-interface-for-skype/&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=R4RXNDz4638:6lHpBNOZyWE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=R4RXNDz4638:6lHpBNOZyWE:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=R4RXNDz4638:6lHpBNOZyWE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=R4RXNDz4638:6lHpBNOZyWE:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?i=R4RXNDz4638:6lHpBNOZyWE:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rubyflowru/~4/R4RXNDz4638" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 11 May 2012 11:52:03 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/rubyflowru/~3/R4RXNDz4638/1297</link>
      <guid isPermaLink="false">http://rubyflow.ru/items/1297</guid>
    <feedburner:origLink>http://rubyflow.ru/items/1297</feedburner:origLink></item>
    <item>
      <title>ActiveRecord::Relation#merge или как объединиться с друзьями</title>
      <description>&lt;p&gt;Цель данного обзора показать пару приемов использования метода &lt;code&gt;#merge&lt;/code&gt; из модуля &lt;code&gt;ActiveRecord::SpawnMethods&lt;/code&gt;, предназначенного для объединения скоупов.
&lt;code&gt;relation_destination.merge(relation_source)&lt;/code&gt; добавляет sql-выражение из &lt;code&gt;relation_source&lt;/code&gt; в  итоговый &lt;code&gt;relation_destination&lt;/code&gt;. Приведу пару примеров.&lt;/p&gt;

&lt;p&gt;Допустим мы хотим получить список всех оплаченных заказов, но только для клиентов с голубыми глазами. В общем случае это могло бы быть так:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Order.paid.joins(:user).where(:users =&amp;gt; { :eye_color =&amp;gt; 'blue' })

# =&amp;gt; SELECT "orders".* 
     FROM "orders" 
     INNER JOIN "users" ON "users"."id" = "orders"."user_id" 
     WHERE "orders"."status" = 3 AND "users"."eye_color" = 'blue'
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Но в таком подходе есть проблема: мы должны знать все тонкости выборки этих самых клиентов с голубыми глазами. И возможно, что таковыми должны быть не только клиенты с признаком &lt;code&gt;eye_color =&amp;gt; 'blue'&lt;/code&gt;, но и со статусом равным 1.  В таком случае, чтобы разместить логику «голубых глаз» в едином удобном месте логично сделать scope в модели User:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class User &amp;lt; ActiveRecord::Base
  STATUS = { :visible =&amp;gt; 1 }
  has_many :orders

  scope :blue_eye, where(:eye_color =&amp;gt; 'blue', :status =&amp;gt; STATUS[:visible])
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Теперь мы можем изменить первый вариант на:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Order.paid.where(:user_id =&amp;gt; User.blue_eye.pluck(:id))

# =&amp;gt; SELECT id FROM "users" 
     WHERE "users"."eye_color" = 'blue' AND "users"."status" = 1
# =&amp;gt; SELECT "orders".* FROM "orders" 
     WHERE "orders"."status" = 3 AND "orders"."user_id" IN (2, 3)   
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Таким образом мы избавились от первоначальной проблемы. Но возник другой момент: такая запись генерирует 2 запроса к БД (к пользователям и к заказам). При этом id'шники пользователей будут переданы во второй sql-запрос. И если пользователей с голубыми глазами будет много (сотни/тысячи), то sql-команда получится очень длинной и в большинстве случаев далеко не оптимальной (разбор плана и т.д.).&lt;/p&gt;

&lt;p&gt;И вот на помощь к нам приходит &lt;code&gt;Relation#merge&lt;/code&gt;:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Order.paid.joins(:user).merge(User.blue_eye)

# =&amp;gt; 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
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Такая цепочка вернет нужные нам заказы за один запрос с использованием SQL оператора JOIN. На мой взгляд, это выглядит достаточно лаконично, причём как с точки зрения AR, так и точки зрения результирующего sql-запроса. Если по какой-то причине мы изменим логику получения клиентов с голубыми глазами, то достаточно будет изменить scope в модели User и все другие запросы получат новые условия.&lt;/p&gt;

&lt;p&gt;Давайте теперь станем более социально-ориентированными и сделаем выборку не просто по всем пользователям, а по друзьям. Цель: получить список самых популярных статей среди друзей подтвердивших статус дружбы. Для этого можно воспользоваться вот такими вот моделями:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;class Friendship &amp;lt; ActiveRecord::Base
  STATUS = {:verified =&amp;gt; 5}
  belongs_to :user
  belongs_to :friend, :class_name =&amp;gt; 'User',
             :conditions =&amp;gt; { :friendships =&amp;gt; { :status =&amp;gt; STATUS[:verified] } }
end

class Article &amp;lt; ActiveRecord::Base
  belongs_to :user
end

class User &amp;lt; ActiveRecord::Base
  STATUS = { :visible =&amp;gt; 1 }
  has_many :friendships, :dependent =&amp;gt; :destroy
  has_many :friends, :through =&amp;gt; :friendships,
           :conditions =&amp;gt; { :status =&amp;gt; STATUS[:visible] }
  has_many :articles

end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Несколько вариантов достижения поставленной цели:&lt;/p&gt;

&lt;p&gt;1) Все условия в одном вызове:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt; user = User.first

 Article.joins(:user).
   joins('INNER JOIN friendships on users.id = friendships.friend_id').
   where(:friendships =&amp;gt; 
     { :user_id =&amp;gt; user, :status =&amp;gt; Friendship::STATUS[:verified]}).
   where( :users =&amp;gt; {:status =&amp;gt; User::STATUS[:visible]}).
   order('articles.rating desc')

# =&amp;gt; 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
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;2) 2 sql-запроса, идентификаторы пользователей передаются списком в функцию IN:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user = User.first
Article.where(:user_id =&amp;gt; user.friends).
  order('articles.rating desc')

# =&amp;gt; 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)

# =&amp;gt; SELECT "articles".* FROM "articles" 
     WHERE "articles"."user_id" IN (2, 3) 
     ORDER BY articles.rating desc
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;strong&gt;3) В один запрос с JOIN:&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user = User.first
Article.joins(:user).merge(user.friends.scoped).
  order('articles.rating desc')

# =&amp;gt; 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
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Пример с &lt;code&gt;Relation#merge&lt;/code&gt; демонстрирует как получить sql-запрос с объединением по друзьям. Немаловажно то, что в запрос включены все те условия, которые мы задали в ассоциациях.&lt;/p&gt;

&lt;p&gt;На этом можно было бы и закончить данный обзор, но остался ещё один подводный камень: в Rails 3.0.x такой красивый merge к сожалению изменит &lt;code&gt;SELECT "articles".* FROM&lt;/code&gt;   на &lt;code&gt;SELECT "users".* FROM&lt;/code&gt;, что в результате вернет пользователей, а не статьи. Чтобы это побороть, можно добавить метод экземпляра в модель User:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;def join_friends
  Friendship.scoped.
    joins('INNER JOIN friendships on friendships.friend_id = users.id').
    where(:user_id =&amp;gt; id, :status =&amp;gt; Friendship::STATUS[:verified]).
    where(:users =&amp;gt; {:status =&amp;gt; STATUS[:visible]})
end
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Тогда популярные статьи друзей можно получить так:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;user = User.first
Article.joins(:user).merge(user.join_friends).
  order('articles.rating desc')

# =&amp;gt; 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
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Вот и все, спасибо за внимание!&lt;/p&gt;

&lt;p&gt;Полезные ссылки:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://railscasts.com/episodes/215-advanced-queries-in-rails-3"&gt;Advanced Queries in Rails 3&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://blog.mitchcrowe.com/blog/2012/04/14/10-most-underused-activerecord-relation-methods/"&gt;The 10 Most Underused ActiveRecord::Relation Methods&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=CYfpNlNVA-0:Xybyh3cgfQQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=CYfpNlNVA-0:Xybyh3cgfQQ:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=CYfpNlNVA-0:Xybyh3cgfQQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=CYfpNlNVA-0:Xybyh3cgfQQ:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?i=CYfpNlNVA-0:Xybyh3cgfQQ:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rubyflowru/~4/CYfpNlNVA-0" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 11 May 2012 08:45:48 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/rubyflowru/~3/CYfpNlNVA-0/1296</link>
      <guid isPermaLink="false">http://rubyflow.ru/items/1296</guid>
    <feedburner:origLink>http://rubyflow.ru/items/1296</feedburner:origLink></item>
    <item>
      <title>DevConf: открыто голосование</title>
      <description>&lt;p&gt;Всего подано 57 заявок в восьми категориях. В категории посвященной Ruby предлагаются следующие темы:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://devconf.ru/offers/32"&gt;Опыт эксплуатации большого Ruby проекта&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://devconf.ru/offers/41"&gt;Sprockets under the hood&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://devconf.ru/offers/42"&gt;OpenSource стартап на Ruby&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://devconf.ru/offers/52"&gt;Локализация приложения на базе Rails. Личный опыт и советы&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;У вас есть возможность отдать свой голос за интересные доклады - &lt;a href="http://devconf.ru/offers/"&gt;http://devconf.ru/offers/&lt;/a&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=DI7JQzi1p1g:CBtTd1H_iNU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=DI7JQzi1p1g:CBtTd1H_iNU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=DI7JQzi1p1g:CBtTd1H_iNU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/rubyflowru?a=DI7JQzi1p1g:CBtTd1H_iNU:-BTjWOF_DHI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/rubyflowru?i=DI7JQzi1p1g:CBtTd1H_iNU:-BTjWOF_DHI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/rubyflowru/~4/DI7JQzi1p1g" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 10 May 2012 17:24:58 +0000</pubDate>
      <link>http://feedproxy.google.com/~r/rubyflowru/~3/DI7JQzi1p1g/1295</link>
      <guid isPermaLink="false">http://rubyflow.ru/items/1295</guid>
    <feedburner:origLink>http://rubyflow.ru/items/1295</feedburner:origLink></item>
  </channel>
</rss>

