Я читав про використання модельних проблем для моделей жиру на шкірі, а також ПУШИТИ свої коди моделей. Ось пояснення з прикладами:
1) СУШКА модельних кодів
Розглянемо модель статті, модель події та модель коментаря. До статті чи події є багато коментарів. Коментар належить або до статті, або до події.
Традиційно моделі можуть виглядати так:
Модель коментаря:
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
Як ми можемо помітити, є значна частина коду, спільна як для події, так і для статті. Використовуючи проблеми, ми можемо витягти цей загальний код в окремому модулі Commentable.
Для цього створіть файл commentable.rb у додатку / моделях / проблемах.
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
файл в / моделі / проблем / папки подій додатки
відвідуваність.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". Технічне групування буде означати "Валідаційні методи", "FinderMethods" тощо