С Rails 4 концепция использования проблем для модульности и сушки ваших моделей была в центре внимания.
Проблемы, в основном, позволяют группировать сходный код модели или нескольких моделей в одном модуле, а затем использовать этот модуль в моделях. Вот пример:
Рассмотрим модель 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 Model. Используя проблемы, мы можем извлечь этот общий код в отдельный модуль Commentable.
Для этого создайте файл commentable.rb в app / model / 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
Одна вещь, которую я хотел бы подчеркнуть при использовании проблем, заключается в том, что Проблемы должны использоваться для групповой группировки, а не для технической группировки. «Taggable» и т. Д. Техническая группировка будет выглядеть как «FinderMethods», «ValidationMethods».
Вот ссылка на пост , который я нашел очень полезным для понимания проблем в Моделях.
Надеюсь, рецензия поможет:)