🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Article View: pl.comp.lang.ruby
Article #825

Re: RoR vs PHP

#825
From: Maciej Piechotka
Date: Tue, 01 Jan 2008 19:45
131 lines
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.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>

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