Wygląda na to, że powinien on mieć prostą odpowiedź, ale po długim czasie w Google i SO nie mogę go znaleźć. Może to być przypadek braku właściwych słów kluczowych.Szyny: utrzymywanie DRY z modelami ActiveRecord, które mają podobne atrybuty złożone
W mojej aplikacji RoR mam kilka modeli, które dzielą określony rodzaj atrybutu string, który ma specjalną walidację i inne funkcje. Najbliższym podobnym przykładem, jaki mogę sobie wyobrazić, jest ciąg znaków reprezentujący adres URL.
Prowadzi to do wielu powieleń w modelach (i jeszcze więcej powielania w testach jednostkowych), ale nie jestem pewien, jak zrobić to bardziej SUCHE.
mogę myśleć o kilku możliwych kierunkach ...
- tworzyć wtyczki wzdłuż linii na „validates_url_format_of” wtyczki, ale to spowodowałoby tylko walidacji DRY
- dać ten specjalny łańcuch własnego modelu, ale wydaje się, że to bardzo trudne rozwiązanie
- utworzyć klasę ruby dla tego specjalnego ciągu, ale jak uzyskać ActiveRecord, aby powiązać tę klasę z atrybutem modelu, który jest ciąg w db
numer 3 wydaje się najbardziej uzasadnione, ale nie mogę dowiedzieć się, jak przedłużyć ActiveRecord obsłużyć coś innego niż typów danych bazowych. Jakieś wskazówki?
Wreszcie, jeśli jest sposób, aby to zrobić, gdzie w hierarchii folderów można umieścić nową klasę, która nie jest modelem?
Wielkie dzięki.
UPDATE:
Potencjalnym rozwiązaniem wstawionej stosując sugestię Matta poniżej (i wykorzystując przykład URL). Zauważ, że jest to bliższe psuedokodowi niż prawdziwemu rubinowi i ma raczej przekazywać zasadę niż idealną składnię.
Najpierw utwórz url
mixin:
module Url
def url_well_formed?
[...]
end
def url_live?
[...]
end
end
iw Site
modelu, to ten moduł:
Class Site < ActiveRecord:Base
include Url
validate :url_well_formed?
end
I kiedy trzeba sprawdzić, że strona pod adresem URL znajduje się pod napięciem, do ...
if site.url_live?
[...]
end
To, czego nie rozwiąże, to jak zrobić on testuje DRY. Jeśli mam inny model, na przykład Page
, który również używa mixina Url
, nadal będzie potrzebował duplikatu zestawu testów jednostkowych dla adresu URL. Oczywiście, mógłbym umieścić je w pomocniku, ale to wydaje się nieporządne.
Czy istnieje bardziej podstawowe rozwiązanie, czy jest tak dobre, jak to tylko możliwe?
Thanks Matt. Widzę, jak wstawek dostanie mi część drogi (co same modele dość suchy). Teraz zastanawiam się, jak mogę również testy jednostkowe DRY, ale to chyba bardziej ogólne pytanie wokół testów jednostkowych odwzorowywania modułów. – Greg