<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/css" href="/stylesheets/rss.css"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/">
  <channel>
    <title>Jaros&#322;aw Zabie&#322;&#322;o - BLOG: Sequel vs Active Record. Cz&#281;&#347;&#263; 2 - integracja Rails z Sequelem</title>
    <link>http://blog.zabiello.com/articles/2007/12/21/integracja-rails-z-sequelem</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>moje notatki, linki, komentarze</description>
    <item>
      <title>Sequel vs Active Record. Cz&#281;&#347;&#263; 2 - integracja Rails z Sequelem</title>
      <description>&lt;p&gt;W &lt;a href="http://blog.zabiello.com/articles/2007/12/13/slabosci-active-record"&gt;pierwszej cz&#281;&#347;ci&lt;/a&gt; troch&#281; wypunktowa&#322;em s&#322;abe strony standardowego &lt;span class="caps"&gt;ORM&lt;/span&gt;&amp;#8217;a u&#380;ywanego w Railsach. Najlepiej zast&#261;pi&#263; go szybszym i og&#243;lnie du&#380;o lepszym &lt;a href="http://code.google.com/p/ruby-sequel/"&gt;Sequelem&lt;/a&gt;. Mo&#380;na to zrobi&#263; na kilka sposob&#243;w: ca&#322;kowicie zast&#261;pi&#263; Active Record lub u&#380;ywa&#263; Sequela obok Active Record &amp;#8211; jak kto woli.&lt;/p&gt;


	&lt;p&gt;Zak&#322;adam, &#380;e na pocz&#261;tek mo&#380;e by&#347;my chcieli popr&#243;bowa&#263; Sequela tak, aby mo&#380;na by&#322;o szybko prze&#322;&#261;czy&#263; si&#281; z powrotem na Active Record. Po doinstalowaniu gema &lt;code&gt;sequel&lt;/code&gt; , nale&#380;y przej&#347;&#263; do pliku config/environment.rb i doda&#263; gdzie&#347; nast&#281;puj&#261;cy kod:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;sequel&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="constant"&gt;DB&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Sequel&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;mysql://login:haslo@localhost/nazwa_bazy&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Obiekt DB jest wielow&#261;tkowym po&#322;aczeniem z baz&#261; definiowan&#261; za pomoc&#261; &lt;span class="caps"&gt;URI&lt;/span&gt;. Jak kto&#347;, chce to mo&#380;na automatycznie zassa&#263; dane o bazie z pliku config/database.sql&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="ident"&gt;require&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;sequel&lt;/span&gt;&lt;span class="punct"&gt;'&lt;/span&gt;
&lt;span class="ident"&gt;conf&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;YAML&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;load_file&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="ident"&gt;config&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;database_configuration_file&lt;/span&gt;&lt;span class="punct"&gt;)[&lt;/span&gt;&lt;span class="constant"&gt;ENV&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;RAILS_ENV&lt;/span&gt;&lt;span class="punct"&gt;']]&lt;/span&gt;
&lt;span class="constant"&gt;DB&lt;/span&gt; &lt;span class="punct"&gt;=&lt;/span&gt; &lt;span class="constant"&gt;Sequel&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;&lt;span class="expr"&gt;#{conf['adapter']}&lt;/span&gt;://&lt;span class="expr"&gt;#{conf['username']}&lt;/span&gt;:&lt;span class="expr"&gt;#{conf['password]}&lt;/span&gt;@&lt;span class="expr"&gt;#{conf['host']}&lt;/span&gt;/&lt;span class="expr"&gt;#{conf['database']}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;  &lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Nast&#281;pnie w modelu mo&#380;na doda&#263; sobie warunek tak, aby trzyma&#263; obie wersje kodu, dla AR i dla Sequela (potem mo&#380;na wywali&#263; to, co nie jest potrzebne).&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;DB&lt;/span&gt;
  &lt;span class="comment"&gt;# Wersja dla Sequel&lt;/span&gt;
  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Preference&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Sequel&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Model&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:preferences&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;user&lt;/span&gt;
      &lt;span class="constant"&gt;User&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;filter&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:id&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="ident"&gt;user_id&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
    &lt;span class="keyword"&gt;end&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;else&lt;/span&gt; 
  &lt;span class="comment"&gt;# Wersja dla Active Record&lt;/span&gt;
  &lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Preference&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;ActiveRecord&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Base&lt;/span&gt;
    &lt;span class="ident"&gt;belongs_to&lt;/span&gt; &lt;span class="symbol"&gt;:user&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Zamiast metody &lt;code&gt;user&lt;/code&gt; mo&#380;na u&#380;y&#263; makra &lt;code&gt;one_to_one :user, :from =&amp;gt; :User&lt;/code&gt; ale ja wol&#281; stworzy&#263; w&#322;asn&#261; metod&#281;. Robi nie tylko to samo, ale tak&#380;e nie trzeba pami&#281;ta&#263; dodatkowych opcji w razie nietypowej struktury. Poza tym w podanym przyk&#322;adzie zwracany jest obiekt proxy, a nie lista obiekt&#243;w. Daje to mo&#380;liwo&#347;ci poza zasi&#281;giem Active Record. Mog&#281; rozbudowywa&#263; zwracany obiekt o kolejne metody. Na ka&#380;dym etapie mam podgl&#261;d do wygenerowanego &lt;span class="caps"&gt;SQL&lt;/span&gt;&amp;#8217;a.&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;Preference&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;first&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;user&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;sql&lt;/span&gt;
&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;SELECT * FROM users WHERE (`id` = 1)&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="constant"&gt;Preference&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;first&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;user&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;order&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:name&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;sql&lt;/span&gt;
&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt;  &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;SELECT * FROM users WHERE (`id` = 1) ORDER BY `name`&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;

&lt;span class="constant"&gt;Preference&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;first&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;user&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;order&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:name&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;select&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:users&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;all&lt;/span&gt;&lt;span class="punct"&gt;).&lt;/span&gt;&lt;span class="ident"&gt;sql&lt;/span&gt;
&lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;span class="string"&gt;SELECT users.* FROM users WHERE (`id` = 1) ORDER BY `name`&lt;/span&gt;&lt;span class="punct"&gt;&amp;quot;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;Albo inny przyk&#322;ad&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="keyword"&gt;class &lt;/span&gt;&lt;span class="class"&gt;Post&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="constant"&gt;Sequel&lt;/span&gt;&lt;span class="punct"&gt;::&lt;/span&gt;&lt;span class="constant"&gt;Model&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:posts&lt;/span&gt;&lt;span class="punct"&gt;)&lt;/span&gt;
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;dataset.old_posts&lt;/span&gt;
    &lt;span class="ident"&gt;filter&lt;/span&gt; &lt;span class="punct"&gt;{&lt;/span&gt;&lt;span class="symbol"&gt;:stamp&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&lt;/span&gt; &lt;span class="number"&gt;30&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;days&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;ago&lt;/span&gt;&lt;span class="punct"&gt;}&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;    
  &lt;span class="keyword"&gt;def &lt;/span&gt;&lt;span class="method"&gt;dataset.clean_old_posts&lt;/span&gt;
    &lt;span class="ident"&gt;old_posts&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;delete&lt;/span&gt;
  &lt;span class="keyword"&gt;end&lt;/span&gt;
&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;

	&lt;p&gt;I mo&#380;na teraz napisa&#263; tak:&lt;/p&gt;


&lt;div class="typocode"&gt;&lt;pre&gt;&lt;code class="typocode_ruby "&gt;&lt;span class="constant"&gt;Post&lt;/span&gt;&lt;span class="punct"&gt;.&lt;/span&gt;&lt;span class="ident"&gt;filter&lt;/span&gt;&lt;span class="punct"&gt;(&lt;/span&gt;&lt;span class="symbol"&gt;:category&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="punct"&gt;'&lt;/span&gt;&lt;span class="string"&gt;ruby&lt;/span&gt;&lt;span class="punct"&gt;').&lt;/span&gt;&lt;span class="ident"&gt;clean_old_posts&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
      <pubDate>Fri, 21 Dec 2007 13:27:00 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:06847b79-6ae4-4629-85e0-3c0c4a414d48</guid>
      <author>Jaros&#322;aw Zabie&#322;&#322;o</author>
      <link>http://blog.zabiello.com/articles/2007/12/21/integracja-rails-z-sequelem</link>
      <category>sequel</category>
      <category>rails</category>
      <category>activerecord</category>
    </item>
    <item>
      <title>"Sequel vs Active Record. Cz&#281;&#347;&#263; 2 - integracja Rails z Sequelem" by pg</title>
      <description>&lt;p&gt;Uzytkownik: niestety adapter MySQL w Sequelu wymaga :user zamiast :username, a poza tym wczytanie database.yml zwr&#243;ci klucze w postaci String a nie Symbol, czego ju&#380; Sequel nie przetrawi. Ja wykombinowalem co&#347; takiego:&lt;/p&gt;


&lt;code&gt;
arc = ActiveRecord::Base.configurations[ENV['RAILS_ENV']].symbolize_keys
DB = Sequel(arc,:user=&amp;gt;arc[:username])
&lt;/code&gt;

	&lt;p&gt;Przetestowane na Sequel 1.0.&lt;/p&gt;</description>
      <pubDate>Sun, 13 Jan 2008 18:57:32 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:b8cea725-462a-4240-a05d-f80334be1bd8</guid>
      <link>http://blog.zabiello.com/articles/2007/12/21/integracja-rails-z-sequelem#comment-1369</link>
    </item>
    <item>
      <title>"Sequel vs Active Record. Cz&#281;&#347;&#263; 2 - integracja Rails z Sequelem" by Uzytkownik</title>
      <description>Kod tworz&#261;cy DB jest chyba znacznie prostszy:
&lt;pre&gt;
&lt;code&gt;
DB = Sequel(YAML.load_file(config.database_configuration_file)[ENV['RAILS_ENV']])
&lt;/code&gt;
&lt;/pre&gt;

	&lt;p&gt;Nie jest to 100% kompatybilne (ale i podana metoda nie jest).&lt;/p&gt;</description>
      <pubDate>Sat, 05 Jan 2008 19:31:32 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:0617b389-02bb-4849-995c-b1403057d906</guid>
      <link>http://blog.zabiello.com/articles/2007/12/21/integracja-rails-z-sequelem#comment-1333</link>
    </item>
    <item>
      <title>"Sequel vs Active Record. Cz&#281;&#347;&#263; 2 - integracja Rails z Sequelem" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;Generalnie Sequel preferuje podej&#347;cie minimalistyczne &amp;#8211; czysty Ruby i mniej magii. Np. zaleca pisanie metod klasowych rozszerzaj&#261;cych podstawowy model ORM zamiast polegania na makrach/helperach do tworzenia powi&#261;za&#324; relacyjnych. Co do walidator&#243;w to jest  &lt;a href="http://validatable.rubyforge.org/" rel="nofollow"&gt;validatable&lt;/a&gt; kt&#243;rego metody powinny da&#263; si&#281; wstrzykn&#261;&#263; do Sequela, ale si&#281; tym nie bawi&#322;em.&lt;/p&gt;</description>
      <pubDate>Wed, 26 Dec 2007 00:20:39 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:3505199e-bbaa-4665-a97f-9be55e209aa1</guid>
      <link>http://blog.zabiello.com/articles/2007/12/21/integracja-rails-z-sequelem#comment-1317</link>
    </item>
    <item>
      <title>"Sequel vs Active Record. Cz&#281;&#347;&#263; 2 - integracja Rails z Sequelem" by pnowak</title>
      <description>&lt;p&gt;tak, wiem ale nie poruszono tutaj chocby tematow testowania, walidatorow itd. czy w rails sa zaszyste jakies zaleznosci z ar na stale ktore nie pozwola na korzystanie z sequel w pelnym zakresie ?&lt;/p&gt;</description>
      <pubDate>Tue, 25 Dec 2007 23:37:38 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:3f014421-d769-4d11-9fd4-baf134431847</guid>
      <link>http://blog.zabiello.com/articles/2007/12/21/integracja-rails-z-sequelem#comment-1316</link>
    </item>
    <item>
      <title>"Sequel vs Active Record. Cz&#281;&#347;&#263; 2 - integracja Rails z Sequelem" by Jaros&#322;aw Zabie&#322;&#322;o</title>
      <description>&lt;p&gt;@pnowak: to&#380; to ca&#322;y tekst jest temu po&#347;wi&#281;cony. :)&lt;/p&gt;</description>
      <pubDate>Mon, 24 Dec 2007 03:09:04 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:6d648f0c-2ee9-4933-9be4-ff7e13149677</guid>
      <link>http://blog.zabiello.com/articles/2007/12/21/integracja-rails-z-sequelem#comment-1315</link>
    </item>
    <item>
      <title>"Sequel vs Active Record. Cz&#281;&#347;&#263; 2 - integracja Rails z Sequelem" by pnowak</title>
      <description>&lt;p&gt;czyli jak rozumiem bez problemu mozna integrowac sequel z RoR ?&lt;/p&gt;</description>
      <pubDate>Sun, 23 Dec 2007 22:27:28 +0100</pubDate>
      <guid isPermaLink="false">urn:uuid:e67ce09b-c8c3-4219-a0b2-3b360edd58c0</guid>
      <link>http://blog.zabiello.com/articles/2007/12/21/integracja-rails-z-sequelem#comment-1313</link>
    </item>
  </channel>
</rss>
