Nie wiem jak rozwiązać taki problem:
Mam formularz realizacji zamówienia i chcę sprawdzić czy zalogowany user (devise) posiada wystarczającą ilość pieniędzy na pokrycie zamówienia (system przed płacowy)
portfele mogą być w różnych walutach tak jak i zamówienia.
Mam takie relacje :
User has_many :wallets, :orders
Wallets belongs_to :user
Order belongs_to :user
Nie wiem za bardzo jak ugryźć ten problem z walidacją
Po prostu zrób własny validator w którym sprawdzisz czy user rzeczywiście posiada wymagane środki.
Co do walut to musisz je jakoś zamieniać, tu pomocny może być gem money.
Nie wiem jak wygląda u Ciebie zasada działania składania zamówień. Zakładam, że jest to po prostu tworzenie instancji np. modelu Order. Validacja musi znajdować się właśnie w tym modelu.
Wiem że muszę napisać validator i też wiem że musi znajdować się w modelu Order. Nie wiem natomiast jak się dobrać do portfela użytkownika w modelu Order.
Najlepiej stwórz sobie metodę, która te wartości z różnych portfeli zamieni na jedna walutę a następnie zsumuje. Wtedy w modelu Order, w metodzie walidacji robisz jedynie warunek z porównaniem:
Wygląda na to, że dostajesz tablicę portfeli, zadziała user.wallets[0].avaiable, trudno powiedzieć czy powinieneś brać pierwszy portfel, czy jak jest ich więcej to ostatni itp.
Dzięki, literówka się wkradła a raczej jej brak.
Jeszcze dorzucę takie pytanie zmianę wartości portfela wykonuję w transakcji nigdy tego nie robiłem i nie jestem pewien czy dobrze robię. I druga sprawa jak przerwać zapisywanie zamówienia jak transakcja się nie powiedzie.
private
def transfer_money
Wallet.transaction do
user.wallets.each do |w|
if w.currency == sell
w.available -= amount
w.in_order += amount
w.save
end
end
end
end[/code] @Arnvald - dzięki za podpowiedź zaraz sobie to do klepie.