Tôi đang sử dụng Ruby on Rails 3.2.2 và tôi muốn lấy/phạm vi các đối tượng liên kết bằng cách "xác định"/"lọc trên" một giá trị thuộc tính trên các đối tượng liên quan. Đó là, vào thời điểm này tôi đang sử dụng đoạn mã sau:Làm thế nào để DRY phạm vi phương pháp được sử dụng trong hai lớp khác nhau?
class Article < ActiveRecord::Base
def self.search_by_title(search)
where('articles.title LIKE ?', "%#{search}%")
end
end
class ArticleAssociation < ActiveRecord::Base
def self.search_by_article_title(search)
joins(:article).where('articles.title LIKE ?', "%#{search}%")
end
end
Trong đoạn mã trên mệnh đề where('articles.title LIKE ?', "%#{search}%")
được lặp lại hai lần và vì vậy tôi nghĩ rằng nó có thể được cải thiện với các nguyên tắc DRY: là nó có thể sử dụng phương phápArticle.search_by_title
trực tiếp trong phương thứcArticleAssociation.search_by_article_title
?
trường hợp sử dụng điển hình là:
ArticleAssociation.search_by_article_title("Sample string")
Article.search_by_title("Sample string")
Tôi phải đối mặt với tình huống tương tự này trong một dự án (4 mô hình liên quan) và tôi đã tạo mô-đun để giữ các phương pháp tìm kiếm phổ biến. Ut không chính xác những gì bạn yêu cầu nhưng nó là một giải pháp điển hình. – tokland
Mã được chia sẻ giữa các lớp thường kết thúc trong một mô-đun – apneadiving
theo cách của chúng, số rây của squeel có thể được sử dụng cho điều này, nhưng sử dụng squeel thay vì AR là một thay đổi lớn .. https://github.com/ernie/squeel#sifters – tokland