Я читал об использовании проблем с моделями для определения размеров кожи, а также для сушки ваших кодов моделей. Вот объяснение с примерами:
1) СУШКА кодов моделей
Рассмотрим модель Article, модель Event и модель Comment. Статья или событие имеет много комментариев. Комментарий относится к статье или событию.
Традиционно модели могут выглядеть так:
Модель комментария:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Модель статьи:
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
Модель события
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
Как мы можем заметить, существует значительный фрагмент кода, общий для Event и Article. Используя проблемы, мы можем извлечь этот общий код в отдельный модуль Commentable.
Для этого создайте файл commentable.rb в app / models / Concers.
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
И теперь ваши модели выглядят так:
Модель комментария:
class Comment < ActiveRecord::Base
belongs_to :commentable, polymorphic: true
end
Модель статьи:
class Article < ActiveRecord::Base
include Commentable
end
Модель события:
class Event < ActiveRecord::Base
include Commentable
end
2) Модели жира для кожи.
Рассмотрим модель событий. Событие имеет много посетителей и комментариев.
Как правило, модель события может выглядеть так
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
Модели со многими ассоциациями и в противном случае имеют тенденцию накапливать все больше и больше кода и становятся неуправляемыми. Озабоченность предоставляет способ облагораживания жировых модулей, делая их более модульными и простыми для понимания.
Вышеприведенная модель может быть реорганизована с использованием следующих проблем: Создайте attendable.rb
иcommentable.rb
файл папке app / models / беспокойства / события
attendable.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
commentable.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
И теперь, используя проблемы, ваша модель событий сводится к
class Event < ActiveRecord::Base
include Commentable
include Attendable
end
* При использовании проблем целесообразно использовать групповую, а не техническую группировку. Группировка на основе доменов похожа на «Commentable», «Photoable», «Attendable». Техническая группировка будет означать «Методы проверки», «Методы поиска» и т. Д.