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?
Author: Jaroslaw Zabiello
Date: Fri, 20 Oct 2006 10:55
Date: Fri, 20 Oct 2006 10:55
25 lines
1995 bytes
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?
Author: Jaroslaw Zabiello
Date: Fri, 20 Oct 2006 13:17
Date: Fri, 20 Oct 2006 13:17
17 lines
1190 bytes
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?
Author: simon
Date: Fri, 20 Oct 2006 14:37
Date: Fri, 20 Oct 2006 14:37
24 lines
1810 bytes
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?
Author: simon
Date: Fri, 20 Oct 2006 14:54
Date: Fri, 20 Oct 2006 14:54
67 lines
3504 bytes
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?
Author: Andrzej Zawadzki
Date: Fri, 20 Oct 2006 18:02
Date: Fri, 20 Oct 2006 18:02
19 lines
1521 bytes
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