Modelowanie relacji

Cześć, jak byście ustawili relację między dwoma modelami np Produkt i Cena, tak żeby dało się sprawdzić ile mamy produktów w cenie 1,99 a ile w cenie 2,29 , zrobić to na zasadzie:

Produkt belongs_to cena i Cena has_many produkt
Tylko wtedy chyba trzeba sprawdzać czy mamy już taką cenę w bazie i jeżeli jest to przypisać tylko id ceny do produktu a jeżeli nie ma to stworzyć nową cenę w dobrym kierunku

P.s oczywiście w kodzie używam angielskich nazw :wink:

Cena jako osobny model? A czemu nie jako zwykłe pole w klasie produkt? I potem tylko:

Product.where(:price => price).count

??

zwykla relacja plus jakis scope with_price(x) czy cos takiego

Zreszta troche dziwna ta relacja produkt, cena. Nie prosciej by produkt mial cene i wtedy Product.where(:price => x)

i tyle

Eh spóźniłem się ;]

Na początku miałem zamiar zrobić pole cena w modelu produkt ale jak będę chciał wyświetlić coś takiego :

w cenie 1,99 mamy 14 produktów
w cenie 2,29 mamy 33 produkty

czyli potrzebuję listę wszystkich cen i wydaje mi się logiczne żeby to trzymać w osobnej tabeli (oczywiście mogę się mylić)

To nie jest dobry pomysł, bo cena nie jest obiektem tylko własnością obiektu - jak zmieniasz cenę jednego obiektu, to przecież nie zmieniają się ceny wszystkich pozostałych obiektów mających tę samą cenę. Zwykłe zapytanie group_by powinno załatić sprawę. Jak będą problemy z wydajnością to wystarczy założyć indeks na cenie. I tyle w temacie.

Dzięki za pomoc faktycznie zapomniałem o group_by :wink:

Jak będą problemy z wydajnością to wystarczy założyć indeks na cenie. I tyle w temacie.

Jeszcze mam takie pytanko :
Użytkownik ma “portfel” w PLN i EURO czy powinny być to pola usera. Czy wydzielić to do osobnych tabel wallet_pln o polach np id, balance, last_balance i odpowiednio dla EURO

Dwie tabele? Wydaje mi się to złym pomysłem. Raczej już daj jedną tabelę i dodaj kolumnę ‘currency’. A co z klientem, który posługuje się dwiema walutami? (oczywiście strzelam, bo nie znam logiki aplikacji). Gdyby absolutnie nigdy klient nie mógł mieć dwóch walut jednocześnie, równie dobrze mógłbyś te same pola włączyć w tabelę klienta. W przeciwnym razie w tabeli ‘portfeli’ daj pole ‘client_id’ (czyli wallet.belongs_to :client)

A jak będzie więcej walut (dojdzie USD), to będziesz dopisywał nowe kolumny?

Ja bym zrobił model Wallet z kolumnami currency, balance, last_balance i do Usera dopisał has_many :wallets.

[quote=sebcioz]A jak będzie więcej walut (dojdzie USD), to będziesz dopisywał nowe kolumny?

Ja bym zrobił model Wallet z kolumnami currency, balance, last_balance i do Usera dopisał has_many :wallets.[/quote]
to chyba najrozsądniejsze rozwiązanie.