Tôi đã đọc về việc sử dụng các mối quan tâm của người mẫu đối với người mẫu béo da cũng như DRY lên mã mô hình của bạn. Dưới đây là một lời giải thích với các ví dụ:
1) DRYing lên mã mô hình
Xem xét mô hình Bài viết, mô hình Sự kiện và mô hình Nhận xét. Một bài viết hoặc một sự kiện có nhiều ý kiến. Một bình luận thuộc về Điều hoặc Sự kiện.
Theo truyền thống, các mô hình có thể trông như thế này:
Mô hình bình luận:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Mô hình bài viết:
class Article < ActiveRecord::Base
has_many :comments, as: :commentable
def find_first_comment
comments.first(created_at DESC)
end
def self.least_commented
#return the article with least number of comments
end
end
Mô hình sự kiện
class Event < ActiveRecord::Base
has_many :comments, as: :commentable
def find_first_comment
comments.first(created_at DESC)
end
def self.least_commented
#returns the event with least number of comments
end
end
Như chúng ta có thể nhận thấy, có một đoạn mã đáng kể phổ biến cho cả Sự kiện và Điều. Sử dụng mối quan tâm, chúng tôi có thể trích xuất mã phổ biến này trong một mô-đun riêng biệt Có thể nhận xét.
Đối với điều này, hãy tạo một tệp commentable.rb trong ứng dụng / mô hình / mối quan tâm.
module Commentable
extend ActiveSupport::Concern
included do
has_many :comments, as: :commentable
end
# for the given article/event returns the first comment
def find_first_comment
comments.first(created_at DESC)
end
module ClassMethods
def least_commented
#returns the article/event which has the least number of comments
end
end
end
Và bây giờ mô hình của bạn trông như thế này:
Mô hình bình luận:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Mô hình bài viết:
class Article < ActiveRecord::Base
include Commentable
end
Mô hình sự kiện:
class Event < ActiveRecord::Base
include Commentable
end
2) Mô hình mỡ nướu da.
Hãy xem xét một mô hình Sự kiện. Một sự kiện có nhiều người tham dự và bình luận.
Thông thường, mô hình sự kiện có thể trông như thế này
class Event < ActiveRecord::Base
has_many :comments
has_many :attenders
def find_first_comment
# for the given article/event returns the first comment
end
def find_comments_with_word(word)
# for the given event returns an array of comments which contain the given word
end
def self.least_commented
# finds the event which has the least number of comments
end
def self.most_attended
# returns the event with most number of attendes
end
def has_attendee(attendee_id)
# returns true if the event has the mentioned attendee
end
end
Các mô hình với nhiều hiệp hội và mặt khác có xu hướng tích lũy ngày càng nhiều mã và trở nên không thể quản lý được. Mối quan tâm cung cấp một cách để mô-đun chất béo kích thước da làm cho chúng mô-đun hóa nhiều hơn và dễ hiểu.
Mô hình trên có thể được cấu trúc lại bằng các mối quan tâm như dưới đây: Tạo một tệp attendable.rb
và commentable.rb
tệp trong thư mục ứng dụng / mô hình / mối quan tâm / sự kiện
có thể tham dự.rb
module Attendable
extend ActiveSupport::Concern
included do
has_many :attenders
end
def has_attender(attender_id)
# returns true if the event has the mentioned attendee
end
module ClassMethods
def most_attended
# returns the event with most number of attendes
end
end
end
bình luận.rb
module Commentable
extend ActiveSupport::Concern
included do
has_many :comments
end
def find_first_comment
# for the given article/event returns the first comment
end
def find_comments_with_word(word)
# for the given event returns an array of comments which contain the given word
end
module ClassMethods
def least_commented
# finds the event which has the least number of comments
end
end
end
Và hiện đang sử dụng Mối quan tâm, mô hình Sự kiện của bạn giảm xuống còn
class Event < ActiveRecord::Base
include Commentable
include Attendable
end
* Trong khi sử dụng mối quan tâm, nên đi theo nhóm dựa trên 'tên miền' thay vì nhóm 'kỹ thuật'. Nhóm dựa trên tên miền giống như 'Có thể nhận xét', 'Có thể chụp ảnh', 'Có thể tham dự'. Nhóm kỹ thuật sẽ có nghĩa là 'Xác thựcMethods', 'FinderMethods', v.v.