luisquike
9/20/2016 - 7:14 PM

PORO

No todos los modelos necesariamente son solo ActiveRecord

Crear una abstracción (porque involucra muchos modelos) PORO (Plain Old Ruby Object)

Tambien:

  • No todo lo que requiera un usuario tiene que estar necesariamente en el modelo de usuario.
  • Esta clase solo realiza una acción en especifico

Models Patterns Abstraction

Estos son los problemas con los que cuenta el código.

  • Continiene mucha logica desorganizada en un solo metodo
  • Es dificil de leer y de dar mantenimiento
  • Este modelo toma un rol de un supor modelo.
class UsersController < ApplicationController
	def suspend
		@user = User.find(params[:id])
		@user.suspend!
		redirect_to @user, notice: 'Successfully suspended.'
	end
end

class User < ActiveRecord::Base
	has_many :items
	has_many :reviews

	def suspend!
		self.class.transaction do
			self.update!(is_approved: false)
			self.items.each{ |item| item.update(is_approved: false) }
			self.reviews.each{ |review| review.update(is_approved: false) }
		end
	end
end
class UserSuspension
	def initialize(user)
		@user = user
	end

	def create
		@user.class.transaction do
			disapprove_user!
			disapprove_items!
			disapprove_reviews!
		end
	end

	private
		def disapprove_user!
		def disapprove_items!
		def disapprove_reviews!
end

class UsersController < ApplicationController
	def suspend
		@user = User.find(params[:id])
		suspension = UserSuspension.new(@user)
		suspension.create!

		redirect_to @user, notice: 'Successfully suspended.'
	end
end