W ramach macania się z Rubym i Railsami planuję napisać sobie stosunkowo prostą aplikację (tyle że trochę nietypową).
Mianowicie są pewne źródła danych, które co jakiś czas (załóżmy raz dziennie) są odpytywane o nową treść.
Jeśli treść się zmieni, użytkownicy zarejestrowani mają zostać powiadomieni o tej zmianie i o jej szczegółach.
Póki co wymyśliłem sobie to tak, że w bazie będę trzymał rekord dla danego źródła z poprzednią wartością (do porównania z nową).
I teraz pytania i wątpliwości:
Czy ta klasa powinna leżeć razem z innymi modelami AR (typu User, Subscription itp)?
Czy logika do porównywania treści i zastępowania wartości powinna być w tej klasie (kod poniżej)
[code]class ValueSnapshot
def diff(current)
# porownanie z istniejaca
end
def update_current
# update_attributes - zastapi istniejaca wartosc wartoscia z current
end
end[/code]
Polecam zapoznać się z activerecord-diff - pozwoli Ci na sprawdzenie zmian. Wtedy w zasadzie nie będziesz potrzebował osobnego modelu, tylko dodatkową metodę, która poinformuje użytkowników o zmianach, jeśli dwa obiekty się różnią
Nie chodzi mi o diff na modelach.
Chodzi o to, że chcę trzymać w bazie pewne informacje na temat starej treści, a następnie przy pobraniu nowych w pewien sposób je porównać (uwzględniając pewne czynniki zewnętrzne). Powiadomienie jest wysyłane lub nie w zależności od wyniku tego porównania. Następnie chcę sobie zachować dane o nowych wartościach do porównania np. z jutrzejszymi (przy jutrzejszym sprawdzeniu).
Pytania są bardziej filozoficzne może niż programistyczne, ale nie chciałbym od początku źle się nauczyć. Czy taka klasa, która z typowego CRUDa ma jedynie U i nie jest w żaden sposób używana przez żaden kontroler ani widok, powinna leżeć razem z innymi modelami AR i czy powinna również zawierać całą tą logikę do porównywania (czy może powinna ona być wyizolowana np do modułu)
Nie ma żadnych specjalnych zasad, ale jeśli korzysta z modeli to jest spora szansa, że sama jest też modelem, powiedzmy “wyższego poziomu”. Wrzuć do /app/models i zobacz po jakimś czasie czy Ci to tam pasuje. Jeśli dojdziesz do wniosku, że wolisz takie rzeczy trzymać w /lib, to przeniesienie pliku jest tanie , a Railsy sobie spokojnie poradzą ze znalezieniem klasy w nowym miejscu.