Bu, doğrudan bir yanıt vermesi gerektiği gibi görünüyor, ancak Google ve SO'da çok fazla zaman geçtikten sonra bunu bulamıyorum. Doğru anahtar kelimeleri kaçırmak olabilir.Raylar: benzer karmaşık özellikleri paylaşan ActiveRecord modelleriyle DRY'yi koruma
RoR uygulamasında, özel doğrulama ve diğer işlevlere sahip belirli bir dize özniteliğini paylaşan birkaç modelim var. Düşündüğüm en yakın örnek, bir URL'yi temsil eden bir dizedir.
Bu, modellerde çok fazla çoğaltma yapılmasına (ve birim testlerinde daha fazla çoğaltma) neden olur, ancak daha fazla DRY'yi nasıl yapacağınızdan emin değilim.
Ben birkaç olası yönlere düşünebilirsiniz...
- "validates_url_format_of" eklentisi, çizgisinde bir eklenti oluşturmak ama bu sadece
- bu özel vermek KURU doğrulamaları yapacak dize kendi modeli, ancak bu
- bu özel dize için bir yakut sınıf oluşturmak çok ağır bir çözüm gibi görünüyor, ama nasıl ActiveRecord bu sınıfı ilişkilendirmek olsundb
Numara 3'te bir dizedir en makul görünüyor, ama temel veri türleri dışında başka bir şey işlemek için ActiveRecord uzatmak için anlamaya olamaz modeli özniteliği ile. Herhangi bir işaretçi?
Son olarak, bunu yapmanın bir yolu varsa, klasör hiyerarşisinde, model olmayan yeni sınıfı nereye koyarsınız?
Çok teşekkürler.
GÜNCELLEME:
potansiyel bir çözüm aşağıda Matt'in mixin öneri kullanarak (ve URL örneğini kullanarak). Not, bu psuedocode'a gerçek yakuttan daha yakındır ve mükemmel sözdiziminden ziyade prensibi taşıması amaçlanmıştır.
İlk olarak bir url
mixin oluşturun:
module Url
def url_well_formed?
[...]
end
def url_live?
[...]
end
end
Ve Site
modelinde, bu modül şunlardır:
Class Site < ActiveRecord:Base
include Url
validate :url_well_formed?
end
Ve URL adresindeki sitesi yayında olduğunu kontrol etmek gerektiğinde, yapın ...
if site.url_live?
[...]
end
Çözmediği şey t nasıl yapılır? o birim DRY test eder. Başka bir modelim varsa, Url
karışımını da kullanan Page
, yine de URL için yinelenen birim testleri kümesine gerek duyar. Elbette, bunları bir yardımcıya koyabilirdim, ama bu dağınık görünüyor.
Daha temel bir çözüm var mı, yoksa aldığı kadar mı?
Teşekkür Matt – Greg