Article View: pl.comp.lang.ruby
Article #825Re: RoR vs PHP
From: Maciej Piechotka
Date: Tue, 01 Jan 2008 19:45
Date: Tue, 01 Jan 2008 19:45
131 lines
6018 bytes
6018 bytes
On Tue, 01 Jan 2008 18:11:36 +0000, Jaroslaw Zabiello wrote:
> On Tue, 01 Jan 2008 16:28:01 -0000, Maciej Piechotka
> <uzytkownik2@gmail.com> wrote:
>
>> 1. W Ruby się da ale *ActiveRecord* tego *nie* *obsługuje*
>> (przynajmniej tak piszą sami w wiki).
>
> Myśle, że da się i w AR ale nie na wbudowanych makrach bo są zabyt
> prymitywne. Trzeba to zrobić na własnych metodach. Tu masz działający
> kod dla pierwszego przypadku. Użyłem tu Sequela (bo jest dużo lepszy od
> AR):
>
> require 'rubygems'
> require 'sequel_model'
>
> DB = Sequel('mysql://root:@localhost/test')
>
> class Parent < Sequel::Model(:parents)
> # Ta deklaracja jest opcjonalna
> # Używam jej aby stworzyć tabelę w bazie
> set_schema do
> primary_key :id
> varchar :type, :null => false
> varchar :pole_parent
> varchar :pole1
> varchar :pole2
> end
> end
>
> # Tworzymy tabelę, (jeśli istniała zostanie usunięta)
> Parent.create_table!
>
> # Opcjonalnie trochę przyblokuję możliwość # zapisu do niewłaściwego
> pola
> module DatabaseSecurity
> def forbidden(fields)
> forbidden_fields = fields & changed_columns unless
> forbidden_fields.empty?
> raise "#{self.class} has no access to #{forbidden_fields.join(',
> ')}!"
> end
> end
> end
>
> class Parent < Sequel::Model(:parents)
> include DatabaseSecurity
> before_save do
> forbidden [:pole1, :pole2]
> self.type = self.class.to_s
> end
> end
>
> # Kolejne klasy nie mają swoich tabel, # operują na tej jednej,
> odziedziczonej
>
> class Child1 < Parent
> before_save do
> forbidden [:pole_parent, :pole2]
> self.type = self.class.to_s
> end
> end
>
> class Child2 < Parent
> before_save do
> forbidden [:pole_parent, :pole1]
> self.type = self.class.to_s
> end
> end
>
> # No to potestujmy:
>
> Parent.create :pole_parent => 'parent value' Child1.create :pole1 =>
> 'child1 value' Child2.create :pole2 => 'child2 value'
> Parent.all.map{|row| p row.values}
> # wyniki:
> # {:type=>"Parent", :pole_parent=>"parent value", :pole1=>nil,
> :pole2=>nil, :id=>1}
> # {:type=>"Child1", :pole_parent=>nil, :pole1=>"child1 value",
> :pole2=>nil, :id=>2}
> # {:type=>"Child2", :pole_parent=>nil, :pole1=>nil, :pole2=>"child2
> value", :id=>3}
>
Ten typ jest obsługiwany przez AR pozostałych dwóch nie (nie wiem jak w
sequel).
>
>> Tzn. Zawsze da się pisać save/select/find przy użyciu SQL ale chyba nie
>> o to chodzi w korzystaniu z AR.
>
> Co ty powiadasz. Właśnie o to chodzi, że kontroler w ogóle nie powinien
> posługiwać się metodami specyficznymi dla danego ORM'a. Zgodnie z zasadą
> "cienkiego kontrolera i bogatego modelu" model powinien ukrywać swoją
> implementację tak, abym mógł bez żadnych zmian w kontrolerze wymienić go
> na inną implementację. Z tego wniosek, że jedyne metody modelu jakie są
> dostępne dla kontrolera to custom methods. I można je w Ruby tak
> owrapować z SQL czy bez że uzyskać te łamańce połączeniowe jakie
> podałeś. Różnica tylko taka, że w Active Record będę musiał użyć SQL'a.
> Zaś w wpadku Sequela tego nie muszę robić, bo jest wystarczająco
> elastyczny.
>
1. Oczywiście mówie o SQL'u w modelu a nie w kontrolerach.
2. Można prosić dla 3 metody kod (1 tabela na klasę) w Sequelu?
3. Cały czas twierdzę, że AR nie potrafi tego zrobić z pudełka. To że
można to pisać przy użyciu SQL'u albo DataMapper/Sequelu to ja wiem ;)
Ale w zasadzie mogę napisać model nie posługując się żadnym AR/DM/S w
czystym Ruby + SQL.
>> 2. Nie zawsze zaczyna się od tabel - czasami tworzy się kod równolegle.
>
> Dane biznesowe są ważniejsze od aplikacji. Zrozumiałem, że miałeś
> sytuację że jest dana baza i należy jakoś ją zamapować w Ruby.
>
Nie. Mamy pewien model dziedziczenia (np. Person, Client, Employee) i mamy
taką strukturę zapisać w bazie danych.
> Tworzenie struktur tabel za pomocą ORM'a nigdy nie będzie doskonałe i
> nie jest możliwe uniknąć SQL jeśli chcemy naprawdę mieć porządną i
> nietrywialną strukturę. Nawet Hibernate ci nic nie pomoże. Optymalizacja
> bazy wymaga użycia specificznych dla niej rozszerzeń SQL'a i już.
Pozdrawiam
--
I've probably left my head... somewhere. Please wait untill I find it.
Homepage (pl_PL): http://uzytkownik.jogger.pl/
(GNU/)Linux User: #425935 (see http://counter.li.org/)
Technical Details
Message-ID:
<grhq45-5dg.ln1@router.piechotka.com.pl>Path:
mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.internetia.pl!nnrpd.internetia.plReferences:
<fl6ahk$m1q$1@inews.gazeta.pl> <op.t351icnsr2rg33@jzmbp.local> <fl93bh$d8p$1@inews.gazeta.pl> <r4il45-1ar.ln1@router.piechotka.com.pl> <op.t358bkfwr2rg33@jzmbp.local> <fl9aau$9b9$5@inews.gazeta.pl> <20071231084648.6d47feda.gryf_esm-no@spam-o2.pl> <op.t37dq3ydr2rg33@jzmbp.local> <0enn45-u25.ln1@router.piechotka.com.pl> <op.t37qnpdrr2rg33@jzmbp.local> <3pbo45-ha7.ln1@router.piechotka.com.pl> <op.t3777x1jr2rg33@jzmbp.local> <jtip45-n8c.ln1@router.piechotka.com.pl> <op.t388lvhur2rg33@jzmbp.local> <h96q45-37f.ln1@router.piechotka.com.pl> <op.t39jhmarr2rg33@jzmbp.local>Show Full Headers
Complete Article Headers
Path: mbox-mo1.pugleaf.net!news-archive.icm.edu.pl!news.gazeta.pl!newsfeed.pionier.net.pl!news.internetia.pl!nnrpd.internetia.pl From: Maciej Piechotka <uzytkownik2@gmail.com> Newsgroups: pl.comp.lang.ruby Subject: Re: RoR vs PHP Date: Tue, 1 Jan 2008 20:45:20 +0100 Organization: Netia S.A. Lines: 132 Message-ID: <grhq45-5dg.ln1@router.piechotka.com.pl> References: <fl6ahk$m1q$1@inews.gazeta.pl> <op.t351icnsr2rg33@jzmbp.local> <fl93bh$d8p$1@inews.gazeta.pl> <r4il45-1ar.ln1@router.piechotka.com.pl> <op.t358bkfwr2rg33@jzmbp.local> <fl9aau$9b9$5@inews.gazeta.pl> <20071231084648.6d47feda.gryf_esm-no@spam-o2.pl> <op.t37dq3ydr2rg33@jzmbp.local> <0enn45-u25.ln1@router.piechotka.com.pl> <op.t37qnpdrr2rg33@jzmbp.local> <3pbo45-ha7.ln1@router.piechotka.com.pl> <op.t3777x1jr2rg33@jzmbp.local> <jtip45-n8c.ln1@router.piechotka.com.pl> <op.t388lvhur2rg33@jzmbp.local> <h96q45-37f.ln1@router.piechotka.com.pl> <op.t39jhmarr2rg33@jzmbp.local> NNTP-Posting-Host: 77-253-113-55.adsl.inetia.pl Mime-Version: 1.0 X-Trace: mx1.internetia.pl 1199218216 14089 77.253.113.55 (1 Jan 2008 20:10:16 GMT) X-Complaints-To: abuse@inetia.pl NNTP-Posting-Date: Tue, 1 Jan 2008 20:10:16 +0000 (UTC) X-Tech-Contact: usenet@internetia.pl X-Orig-Path: router.piechotka.com.pl!news User-Agent: Pan/0.132 (Waxed in Black) X-Server-Info: http://www.internetia.pl/news/ Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit