🚀 go-pugleaf

RetroBBS NetNews Server

Inspired by RockSolid Light RIP Retro Guy

Thread View: pl.comp.lang.ruby
5 messages
5 total messages Started by Jaroslaw Zabiello Fri, 20 Oct 2006 10:55
Czy ActiveRecord jest logiczny?
#246
Author: Jaroslaw Zabiello
Date: Fri, 20 Oct 2006 10:55
25 lines
1995 bytes
W ActiveRecord dosyc mętnie są zaimplementowane relacje. Np. na co wskazuje
belongs_to(:abc)? Na klasę prawda? Tylko dlaczego z małej litery, skoro to
klasa? A w wypadku klas MojaDziwnaKlasa już trzeba napisać belongs_to
:moja_dziwna_klasa. Ja tu nie widzę nic oczywistego.

Ale jest jeszcze gorzej. Bo has_many najwyraźniej wskazuje już nie na klasę
ale na tabelę. Więc pisze się belongs_to :users podczas gdy klasa jest
User. 

Można w tym się nieźle pogubić w wypadku nietypowych tabel z nietypowymi
polami (w sensie nazw i konwencji RoR).

Często mamy do czynienia z głupimi nazwami pól/tabel i wydaje mi się, że
najlepiej jest stworzyć model który za pomocą kompozycji ponazywa wszystkie
pola inaczej. Tylko czy to się da? W Django wszystkie pola muszą być
definiowane w modelu i używanie innej, czytelniejszej nazwy pola w miejsce
pola jakie siedzi w bazie, jest trywialne. AR umożliwia zmianę nazwy tabeli
i klucza głównego. Ale co z resztą pól? Da się to ustawić bezpośrednio w
modelu? Np. mam pole Name_VC i nie mogę używać find_by_Name_VC z powodu
znaczka _. Chciałbym w modelu aby to było pole "name" i aby miał dostępne
findery typu find_by_xxx.

-- 
Jarosław Zabiełło
http://blog.zabiello.com
Re: Czy ActiveRecord jest logiczny?
#248
Author: Jaroslaw Zabiello
Date: Fri, 20 Oct 2006 13:17
17 lines
1190 bytes
Kolejny błąd w implementacji AR:

model:
class MojaTabela < ApplicationController
  set_table_name "tabela_o_nietypowej_nazwie"
  set_primary_key "NietypowyPrimaryKey"
end

kontroler:
...
MojaTabela.find(1) wywala wyjątek, bo zakłada, że klucz główny nazywa
się... ID. To po kiego ustawiałem set_primary_key() aby teraz to było
olewane?

-- 
Jarosław Zabiełło
http://blog.zabiello.com
Re: Czy ActiveRecord jest logiczny?
#249
Author: simon
Date: Fri, 20 Oct 2006 14:37
24 lines
1810 bytes
Jaroslaw Zabiello napisał(a):
> Kolejny błąd w implementacji AR:
>
> model:
> class MojaTabela < ApplicationController
>   set_table_name "tabela_o_nietypowej_nazwie"
>   set_primary_key "NietypowyPrimaryKey"
> end
>
> kontroler:
> ...
> MojaTabela.find(1) wywala wyjątek, bo zakłada, że klucz główny nazywa
> się... ID. To po kiego ustawiałem set_primary_key() aby teraz to było
> olewane?
>

Witam,
Chyba nie do konca masz racje ;)
Sprobuj zmienic dziedziczenie z "ApplicationController" na
"ActiveRecord::Base" i wtedy raczej powinno dzialac ...

Pozdrowienia
Szymon
Re: Czy ActiveRecord jest logiczny?
#247
Author: simon
Date: Fri, 20 Oct 2006 14:54
67 lines
3504 bytes
Jaroslaw Zabiello napisał(a):
> W ActiveRecord dosyc mętnie są zaimplementowane relacje. Np. na co wskazuje
> belongs_to(:abc)? Na klasę prawda? Tylko dlaczego z małej litery, skoro to
> klasa? A w wypadku klas MojaDziwnaKlasa już trzeba napisać belongs_to
> :moja_dziwna_klasa. Ja tu nie widzę nic oczywistego.

Jest oczywiste - metoda belongs_to faktycznie jako parametr bierze
nazwe klasy zamieniana na podkreslenia (patrz. modul Inflector).

> Ale jest jeszcze gorzej. Bo has_many najwyraźniej wskazuje już nie na klasę
> ale na tabelę. Więc pisze się belongs_to :users podczas gdy klasa jest
> User.

Jesli chodzi o has_many to podajemy tam nazwe metody ktora zwroci nam
odpowiednia kolekcje obiektow danej klasy (podanej rowniez jak argument
has_many), przyklad:
A.
class Film < ActiveRecord::Base
  set_table_name 'filmy'
  set_primary_key 'ID_film'
  has_many :repertuar_elements,
    :class_name => "Repertuar",
    :foreign_key => "ID_film"

end
B.
moglo by rowniez byc:

  has_many :wpisow_repertuarowych,
    :class_name => "Repertuar",
    :foreign_key => "ID_film"

i potem:

film = Film.find(1)
A.
film.repertuar_elements
B
film.wpisow_repertuarowych

zrwoci to samo.

Polecam jeszcze uzycie opcji w environmetn.rb:

ActiveRecord::Base.pluralize_table_names = false
(w przypadku poskich nazw tabel - moze to sporo pomoc)

>
> Można w tym się nieźle pogubić w wypadku nietypowych tabel z nietypowymi
> polami (w sensie nazw i konwencji RoR).
>
> Często mamy do czynienia z głupimi nazwami pól/tabel i wydaje mi się, że
> najlepiej jest stworzyć model który za pomocą kompozycji ponazywa wszystkie
> pola inaczej. Tylko czy to się da? W Django wszystkie pola muszą być
> definiowane w modelu i używanie innej, czytelniejszej nazwy pola w miejsce
> pola jakie siedzi w bazie, jest trywialne. AR umożliwia zmianę nazwy tabeli
> i klucza głównego. Ale co z resztą pól? Da się to ustawić bezpośrednio w
> modelu? Np. mam pole Name_VC i nie mogę używać find_by_Name_VC z powodu
> znaczka _. Chciałbym w modelu aby to było pole "name" i aby miał dostępne
> findery typu find_by_xxx.

Da sie to prosto zrobic - polecam Agile Development with Ruby On Rails
-> rozdzial 15.2 Aggregation

Pozdrowienia,
Szymon
Re: Czy ActiveRecord jest logiczny?
#250
Author: Andrzej Zawadzki
Date: Fri, 20 Oct 2006 18:02
19 lines
1521 bytes
Jaroslaw Zabiello wrote:

> W ActiveRecord dosyc mętnie są zaimplementowane relacje. Np. na co
> wskazuje belongs_to(:abc)? Na klasę prawda? Tylko dlaczego z małej litery,
> skoro to klasa? A w wypadku klas MojaDziwnaKlasa już trzeba napisać
> belongs_to
> :moja_dziwna_klasa. Ja tu nie widzę nic oczywistego.
> Ale jest jeszcze gorzej. Bo has_many najwyraźniej wskazuje już nie na
> klasę ale na tabelę. Więc pisze się belongs_to :users podczas gdy klasa
> jest User.

A czy ta konwencja nie jest po prostu czysto gramatyczna?
has_many => nazwa_klasy_underscored_and_pluralized
has_one  => nazwa_klasy_underscored
Dla mnie takie przyporzadkowanie wydaje sie zupelnie oczywiste;)

Pozdrawiam
-- 
Andrzej Zawadzki
Thread Navigation

This is a paginated view of messages in the thread with full content displayed inline.

Messages are displayed in chronological order, with the original post highlighted in green.

Use pagination controls to navigate through all messages in large threads.

Back to All Threads