2010-05-20 30 views
5

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

  1. 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
  2. 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
  3. 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?

Trả lời

2

Bạn có thể tạo mô-đun với tất cả các phương pháp phổ biến và nhập mô-đun? Google cho mixins.

+0

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

6

Tạo một mô hình trừu tượng:

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

Kế thừa mô hình của bạn từ các mô hình trừu tượng:

class User < CommonBase 
end 

class Post < CommonBase 
end 
+0

Cảm ơn KandadaBoggu. Ai có thể tạo ra một bài kiểm tra đơn vị mà ánh xạ tới một mô hình trừu tượng? Và một câu hỏi về tổ chức: bạn sẽ đặt cái này ở đâu? – Greg

+1

Cuộc gọi trừu tượng ở trên phải là: 'self.abstract_class = true' – tjmcewan

Các vấn đề liên quan