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