Điều này có vẻ như nó phải có câu trả lời đơn giản, nhưng sau nhiều thời gian trên Google và SO tôi không thể tìm thấy nó. Đó có thể là trường hợp thiếu từ khóa phù hợp.Rails: giữ DRY với các mô hình ActiveRecord chia sẻ các thuộc tính phức tạp tương tự
Trong ứng dụng RoR của tôi, tôi có một số mô hình chia sẻ một loại thuộc tính chuỗi cụ thể có xác thực đặc biệt và chức năng khác. Ví dụ tương tự gần nhất mà tôi có thể nghĩ là một chuỗi đại diện cho một URL.
Điều này dẫn đến nhiều trùng lặp trong các mô hình (và thậm chí nhiều bản sao trong các bài kiểm tra đơn vị), nhưng tôi không chắc chắn làm thế nào để làm cho nó nhiều DRY.
tôi có thể nghĩ ra nhiều hướng khác nhau càng tốt ...
- tạo một plugin dọc theo dòng của "validates_url_format_of" plugin , nhưng điều đó sẽ chỉ làm cho kiểm chứng thực DRY
- cho này đặc biệt chuỗi mô hình riêng của nó, nhưng điều này có vẻ giống như một giải pháp rất nặng
- tạo lớp ruby cho chuỗi đặc biệt này, nhưng làm cách nào để nhận được ActiveRecord để liên kết lớp này với thuộc tính mô hình là một chuỗi trong db
Số 3 có vẻ hợp lý nhất, nhưng tôi không thể tìm ra cách mở rộng ActiveRecord để xử lý bất kỳ điều gì khác ngoài các loại dữ liệu cơ sở. Bất kỳ con trỏ?
Cuối cùng, nếu có cách để thực hiện việc này, trong hệ thống phân cấp thư mục bạn sẽ đặt lớp mới không phải là mô hình ở đâu?
Rất cám ơn.
CẬP NHẬT:
Một giải pháp tiềm năng sử dụng gợi ý mixin Matt dưới đây (và sử dụng các ví dụ URL). Lưu ý, điều này gần với psuedocode hơn ruby thực và được dự định để truyền đạt nguyên tắc chứ không phải là cú pháp hoàn hảo.
Đầu tiên, tạo một mixin url
:
module Url
def url_well_formed?
[...]
end
def url_live?
[...]
end
end
Và trong một mô hình Site
, bao gồm mô-đun này:
Class Site < ActiveRecord:Base
include Url
validate :url_well_formed?
end
Và khi tôi cần phải kiểm tra xem các trang web tại URL là sống, do ...
if site.url_live?
[...]
end
Điều này không giải quyết được là làm thế nào để t anh ta kiểm tra đơn vị DRY. Nếu tôi có một mô hình khác, giả sử Page
, cũng sử dụng kết hợp Url
, nó vẫn sẽ cần một bộ kiểm tra đơn vị trùng lặp cho URL. Tất nhiên, tôi có thể đặt chúng trong một người trợ giúp, nhưng điều đó có vẻ lộn xộn.
Có giải pháp cơ bản hơn hay điều này tốt như vậy?
Cảm ơn Matt. Tôi có thể xem cách mixin sẽ giúp tôi trở thành một phần của con đường (làm cho các mô hình trở nên khá SẠCH). Bây giờ tôi tự hỏi làm thế nào tôi cũng có thể làm cho các bài kiểm tra đơn vị DRY, nhưng đó có lẽ là một câu hỏi tổng quát hơn xung quanh các bài kiểm tra đơn vị bản đồ cho các mô-đun. – Greg