2010-05-20 4 views
5

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 ...

  1. tworzyć wtyczki wzdłuż linii na „validates_url_format_of” wtyczki, ale to spowodowałoby tylko walidacji DRY
  2. dać ten specjalny łańcuch własnego modelu, ale wydaje się, że to bardzo trudne rozwiązanie
  3. 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?

Odpowiedz

2

Można utworzyć moduł ze wszystkimi popularnymi metodami i zaimportować moduł? Google dla mixins.

+0

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

6

Załóż abstrakcyjny model:

class CommonBase < ActiveRecord::Base 
    self.abstract_class = true # makes the model abstract 
    validate_format_of :url_field, :with => /.../ 
end 

dziedziczą swoje modele z abstrakcyjnego modelu

class User < CommonBase 
end 

class Post < CommonBase 
end 
+0

Dzięki KandadaBoggu. Czy można utworzyć test jednostkowy, który mapuje do modelu abstrakcyjnego? I pytanie organizacyjne: gdzie byś to umieścił? – Greg

+1

Streszczenie wezwanie powyżej powinny być: 'self.abstract_class = TRUE – tjmcewan

Powiązane problemy