<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	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>Comments on: Using sub-queries to avoid multiple DB requests in Rails</title>
	<atom:link href="http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/feed/" rel="self" type="application/rss+xml" />
	<link>http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/</link>
	<description>In my blog I&#039;ll try to describe about interesting technologies, my discovery in IT and some useful things about programming.</description>
	<lastBuildDate>Tue, 06 Apr 2010 13:34:30 +0000</lastBuildDate>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
	<item>
		<title>By: Roman Dmytrenko</title>
		<link>http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/comment-page-1/#comment-47132</link>
		<dc:creator>Roman Dmytrenko</dc:creator>
		<pubDate>Sat, 31 Jul 2010 14:43:00 +0000</pubDate>
		<guid isPermaLink="false">http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/#comment-47132</guid>
		<description>Мог бы просто ответить, что кеширование есть :). К чему какие подробности.</description>
		<content:encoded><![CDATA[<p>Мог бы просто ответить, что кеширование есть :). К чему какие подробности.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dmytro Shteflyuk</title>
		<link>http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/comment-page-1/#comment-47128</link>
		<dc:creator>Dmytro Shteflyuk</dc:creator>
		<pubDate>Sat, 31 Jul 2010 14:34:00 +0000</pubDate>
		<guid isPermaLink="false">http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/#comment-47128</guid>
		<description>2Roman:

[cc lang=&quot;rails&quot;]
# Выбираем видео
@video = Video.find :first
# Загружаем категории отдельным запросом
@video.categories
# Здесь категории юзаются уже загруженные
# дополнительного запроса нет
@video.categories
# Здесь форсируем загрузку категорий
# повторый запрос к базе
@video.categories(true)
[/cc]

Ответил?</description>
		<content:encoded><![CDATA[<p>2Roman:</p>
<div class="codecolorer-container rails twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br /></div></td><td><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color:#008000; font-style:italic;"># Выбираем видео</span><br />
<span style="color:#0066ff; font-weight:bold;">@video</span> = Video.<span style="color:#9900CC;">find</span> :<span style="color:#5A0A0A; font-weight:bold;">first</span><br />
<span style="color:#008000; font-style:italic;"># Загружаем категории отдельным запросом</span><br />
<span style="color:#0066ff; font-weight:bold;">@video</span>.<span style="color:#9900CC;">categories</span><br />
<span style="color:#008000; font-style:italic;"># Здесь категории юзаются уже загруженные</span><br />
<span style="color:#008000; font-style:italic;"># дополнительного запроса нет</span><br />
<span style="color:#0066ff; font-weight:bold;">@video</span>.<span style="color:#9900CC;">categories</span><br />
<span style="color:#008000; font-style:italic;"># Здесь форсируем загрузку категорий</span><br />
<span style="color:#008000; font-style:italic;"># повторый запрос к базе</span><br />
<span style="color:#0066ff; font-weight:bold;">@video</span>.<span style="color:#9900CC;">categories</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">true</span><span style="color:#006600; font-weight:bold;">&#41;</span></div></td></tr></tbody></table></div>
<p>Ответил?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dmytro Shteflyuk</title>
		<link>http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/comment-page-1/#comment-47124</link>
		<dc:creator>Dmytro Shteflyuk</dc:creator>
		<pubDate>Sat, 31 Jul 2010 14:23:00 +0000</pubDate>
		<guid isPermaLink="false">http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/#comment-47124</guid>
		<description>Ты все переставил местами :-) SQL ассоциируется с ассемблером, как Ruby ассоциируется с PHP. Эдакая пропорция. Может немного преувеличено, но смысл такой.

Я не вижу преимущества у следующего кода (PHP, для простоты, именно то, что я назвал &quot;ассемблером&quot;)

[cc lang=&quot;php&quot; tab_size=&quot;2&quot;]
$rs = $db-&gt;fetch_all(&#039;SELECT v.id AS v_id, v.title AS v_title, c.id AS c_id, c.name AS c_name FROM videos v JOIN categories_videos cv ON v.id = cv.video_id JOIN categories c ON c.id = cv.category_id LIMIT 20&#039;)
$old_post_id = 0;
$posts = array();
foreach ($rs as $row) {
	if ($old_post_id != $row[&#039;v_id&#039;]) {
		$post = array(&#039;id&#039; =&gt; $row[&#039;v_id&#039;], &#039;title&#039; =&gt; $row[&#039;v_title&#039;], &#039;categories&#039; =&gt; array());
		$posts[] = $post;
		$old_post_id = $post[&#039;id&#039;];
	}
	$post[&#039;categories&#039;][] = array(&#039;id&#039; =&gt; $row[&#039;c_id&#039;], &#039;name&#039; =&gt; $row[&#039;c_name&#039;]);
}
[/cc]

(код я не проверял, скорее всего не работает) перед кодом на руби с использованием рельсов:

[cc lang=&quot;rails&quot;]
Video.find :all, :include =&gt; :categories, :limit =&gt; 20
[/cc]

Да, не надо меня пинать на тему, что под пхп есть куча фреймворком и мой код не имеет смысла. Просто попробуйте руби и вы не сможете остановиться.

ЗЫ. Приведенный код имеет несколько проблем. Во-первых, я выбрал не все поля (у меня в таблице их десяток), во-вторых использовал &lt;tt&gt;LIMIT&lt;/tt&gt; в SQL, что нельзя использовать в других СУБД, потому еще надо долепить условий. Ну и никаких &lt;tt&gt;WHERE&lt;/tt&gt; тоже не приводил, потому что надоело писать.</description>
		<content:encoded><![CDATA[<p>Ты все переставил местами :-) SQL ассоциируется с ассемблером, как Ruby ассоциируется с PHP. Эдакая пропорция. Может немного преувеличено, но смысл такой.</p>
<p>Я не вижу преимущества у следующего кода (PHP, для простоты, именно то, что я назвал &#8220;ассемблером&#8221;)</p>
<div class="codecolorer-container php twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="php codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #000088;">$rs</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$db</span><span style="color: #339933;">-&gt;</span><span style="color: #004000;">fetch_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'SELECT v.id AS v_id, v.title AS v_title, c.id AS c_id, c.name AS c_name FROM videos v JOIN categories_videos cv ON v.id = cv.video_id JOIN categories c ON c.id = cv.category_id LIMIT 20'</span><span style="color: #009900;">&#41;</span><br />
<span style="color: #000088;">$old_post_id</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span><br />
<span style="color: #000088;">$posts</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #b1b100;">foreach</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$rs</span> <span style="color: #b1b100;">as</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$old_post_id</span> <span style="color: #339933;">!=</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'v_id'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$post</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'v_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'title'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'v_title'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'categories'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$posts</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$post</span><span style="color: #339933;">;</span><br />
&nbsp; &nbsp; <span style="color: #000088;">$old_post_id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$post</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span><br />
&nbsp; <span style="color: #009900;">&#125;</span><br />
&nbsp; <span style="color: #000088;">$post</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'categories'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #990000;">array</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'id'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'c_id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'name'</span> <span style="color: #339933;">=&gt;</span> <span style="color: #000088;">$row</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'c_name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span><br />
<span style="color: #009900;">&#125;</span></div></td></tr></tbody></table></div>
<p>(код я не проверял, скорее всего не работает) перед кодом на руби с использованием рельсов:</p>
<div class="codecolorer-container rails twitlight" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="rails codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Video.<span style="color:#9900CC;">find</span> <span style="color:#ff3333; font-weight:bold;">:all</span>, :<span style="color:#9966CC; font-weight:bold;">include</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:categories</span>, <span style="color:#ff3333; font-weight:bold;">:limit</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">20</span></div></td></tr></tbody></table></div>
<p>Да, не надо меня пинать на тему, что под пхп есть куча фреймворком и мой код не имеет смысла. Просто попробуйте руби и вы не сможете остановиться.</p>
<p>ЗЫ. Приведенный код имеет несколько проблем. Во-первых, я выбрал не все поля (у меня в таблице их десяток), во-вторых использовал <tt>LIMIT</tt> в SQL, что нельзя использовать в других СУБД, потому еще надо долепить условий. Ну и никаких <tt>WHERE</tt> тоже не приводил, потому что надоело писать.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Roman Dmytrenko</title>
		<link>http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/comment-page-1/#comment-47122</link>
		<dc:creator>Roman Dmytrenko</dc:creator>
		<pubDate>Sat, 31 Jul 2010 14:18:00 +0000</pubDate>
		<guid isPermaLink="false">http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/#comment-47122</guid>
		<description>Честно говоря, Вы можете не осознавать всю работу ORM фреймворка для того, чтобы работать с ним.  К тому же вопрос о гибких запросов к базе данных должен подыматься только в случае необходимости.  В большинстве случаем мы делаем большую ошибку, начиная думать об оптимизации. 

Только после нескольких предварительных релизов и более менее установлении архитектуры, можно думать об оптимизации SQL запросов. А так получается - еще ничего не сделали, зато уже хотим оптимизировать. 

Кстати, как с кешированием выборок в RoR?</description>
		<content:encoded><![CDATA[<p>Честно говоря, Вы можете не осознавать всю работу ORM фреймворка для того, чтобы работать с ним.  К тому же вопрос о гибких запросов к базе данных должен подыматься только в случае необходимости.  В большинстве случаем мы делаем большую ошибку, начиная думать об оптимизации. </p>
<p>Только после нескольких предварительных релизов и более менее установлении архитектуры, можно думать об оптимизации SQL запросов. А так получается &#8211; еще ничего не сделали, зато уже хотим оптимизировать. </p>
<p>Кстати, как с кешированием выборок в RoR?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Alex</title>
		<link>http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/comment-page-1/#comment-47118</link>
		<dc:creator>Alex</dc:creator>
		<pubDate>Sat, 31 Jul 2010 13:56:00 +0000</pubDate>
		<guid isPermaLink="false">http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/#comment-47118</guid>
		<description>Обижаться конечно же не стану, не для того вопрос задал.
Обязательно попытаюсь узнать что такое Ruby и с чем эти вкусности едят :).
Ну а по поводу сложности и рутины - не зная как устроены эти самые классы (их ведь писали люди для упрощения каких-то своих задач) не сможешь понять как они работают. Я вот смотрю на эти запросы и со своим приверженством чтоли к языкам так-называемого &quot;среднего уровня&quot;, не понимаю чего хотел программист получить, без обид :).
Приятно конечно осознать, что SQL у кого-то ассоциируется с ассемблером, но все же SQL также написан для людей (не как ассемблер - словесное представление машинных кодов) и надеюсь, что Active Record (как всеже дополнительное звено) не является помехой для конструирования гибких запросов к базе данных.
Не сочти за критику, это лишь мое первое представление, обещаю ознакомиться с Active Record.</description>
		<content:encoded><![CDATA[<p>Обижаться конечно же не стану, не для того вопрос задал.<br />
Обязательно попытаюсь узнать что такое Ruby и с чем эти вкусности едят :).<br />
Ну а по поводу сложности и рутины &#8211; не зная как устроены эти самые классы (их ведь писали люди для упрощения каких-то своих задач) не сможешь понять как они работают. Я вот смотрю на эти запросы и со своим приверженством чтоли к языкам так-называемого &#8220;среднего уровня&#8221;, не понимаю чего хотел программист получить, без обид :).<br />
Приятно конечно осознать, что SQL у кого-то ассоциируется с ассемблером, но все же SQL также написан для людей (не как ассемблер &#8211; словесное представление машинных кодов) и надеюсь, что Active Record (как всеже дополнительное звено) не является помехой для конструирования гибких запросов к базе данных.<br />
Не сочти за критику, это лишь мое первое представление, обещаю ознакомиться с Active Record.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Dmytro Shteflyuk</title>
		<link>http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/comment-page-1/#comment-47077</link>
		<dc:creator>Dmytro Shteflyuk</dc:creator>
		<pubDate>Sat, 31 Jul 2010 12:04:00 +0000</pubDate>
		<guid isPermaLink="false">http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/#comment-47077</guid>
		<description>Этот таинственный язык -- Ruby. Данная заметка посвящена использованию Ruby on Rails (фрейморка), в частности Active Record (ORM этого фреймворка).

Твой воспрос не особо корректен. Это то же самое, что спросить &quot;Зачем использовать ПХП и почему нельзя использовать классический ассемблер?&quot; (без обид, ничего личного) :-)

Active Record берет на себя все сложности (и рутину) составления типовых SQL-запросов, а также конструирует объекты (сущности) вашего приложения из результатов запроса. В общем много всяких вкусностей, настоятельно рекомендую хотя бы посмотреть (скринкаст можно найти на &lt;a href=&quot;http://rubyonrails.org/screencasts&quot; rel=&quot;nofollow&quot;&gt;официальном сайте Ruby on Rails&lt;/a&gt;) или почитать что-нибудь об этом фреймворке, даже если не собираетесь его использовать.</description>
		<content:encoded><![CDATA[<p>Этот таинственный язык &#8212; Ruby. Данная заметка посвящена использованию Ruby on Rails (фрейморка), в частности Active Record (ORM этого фреймворка).</p>
<p>Твой воспрос не особо корректен. Это то же самое, что спросить &#8220;Зачем использовать ПХП и почему нельзя использовать классический ассемблер?&#8221; (без обид, ничего личного) :-)</p>
<p>Active Record берет на себя все сложности (и рутину) составления типовых SQL-запросов, а также конструирует объекты (сущности) вашего приложения из результатов запроса. В общем много всяких вкусностей, настоятельно рекомендую хотя бы посмотреть (скринкаст можно найти на <a href="http://rubyonrails.org/screencasts" rel="nofollow">официальном сайте Ruby on Rails</a>) или почитать что-нибудь об этом фреймворке, даже если не собираетесь его использовать.</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Alex</title>
		<link>http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/comment-page-1/#comment-47072</link>
		<dc:creator>Alex</dc:creator>
		<pubDate>Sat, 31 Jul 2010 11:49:00 +0000</pubDate>
		<guid isPermaLink="false">http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/#comment-47072</guid>
		<description>Вопрос чисто из любопытства :)
Какой язык используется в этом примере и почему нельзя было использовать классический SQL запрос с оператором JOIN?</description>
		<content:encoded><![CDATA[<p>Вопрос чисто из любопытства :)<br />
Какой язык используется в этом примере и почему нельзя было использовать классический SQL запрос с оператором JOIN?</p>
]]></content:encoded>
	</item>
	<item>
		<title>By: Julik</title>
		<link>http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/comment-page-1/#comment-35513</link>
		<dc:creator>Julik</dc:creator>
		<pubDate>Sat, 31 Jul 2010 17:02:00 +0000</pubDate>
		<guid isPermaLink="false">http://kpumuk.info/ruby-on-rails/using-sub-queries-to-avoid-multiple-db-requests-in-rails/#comment-35513</guid>
		<description>Sure thing.

http://bugs.mysql.com/bug.php?id=9021</description>
		<content:encoded><![CDATA[<p>Sure thing.</p>
<p><a href="http://bugs.mysql.com/bug.php?id=9021" rel="nofollow">http://bugs.mysql.com/bug.php?id=9021</a></p>
]]></content:encoded>
	</item>
</channel>
</rss>
