lundi 17 octobre 2016

Rails: improve if statements in model

My question is following: how to improve rails model code such like this:

class Event < ActiveRecord::Base
  scope :upcoming, -> { where('date >= ?', Time.now)
                        .includes(:groups, :creator)
                        .reorder(date: :asc) }
  scope :past, -> { where('date < ?', Time.now)
                    .includes(:groups, :creator) }

  scope :connected, -> (user) {  
    user_groups_ids = user.groups_teacher.pluck(:id).uniq
    joins(:groups).where('groups.id': user_groups_ids).uniq
  }
  scope :created, -> (user) {
    where(user_id: user.id)
  }

  scope :filtered, -> (args) {
    filter = args[:filter]
    kind = args[:kind]
    if(filter == 'upcoming' && kind == 'connected')
      upcoming.connected(args[:user])
    elsif(filter == 'upcoming' && kind == 'created')
      upcoming.created(args[:user])
    elsif(filter == 'past' && kind == 'connected')
      past.connected(args[:user])
    elsif(filter == 'past' && kind == 'created')
      past.created(args[:user])
    elsif(filter == 'upcoming')
      upcoming
    elsif(filter == 'past')
      past
    else
      all      
    end
  }

  belongs_to :creator, class_name: "User", foreign_key: "user_id"
  has_many :groups, through: :group_events
  has_many :group_events
  accepts_nested_attributes_for :groups
  self.per_page = 5
end

I am specifically talking about 'filtered' scope. In my events controller index acion I am always calling filtered scope providing 'filter' and 'kind' from params to get proper events, but I can't find a way not using those ugly if statements. My main goal is to make it SOLID.

Aucun commentaire:

Enregistrer un commentaire