class Zone < ApplicationRecord validates :acronym, presence: true, uniqueness: true has_many :labels, -> { order(designated_on: :desc) }, class_name: 'ZoneLabel', inverse_of: :zone has_and_belongs_to_many :procedures, -> { order(published_at: :desc) }, inverse_of: :zone def current_label labels.where.not(name: 'Non attribué').first.name end def label_at(date) label = labels.where('designated_on < ?', date)&.first || labels.last label.name end def available_at?(date) label_at(date) != 'Non attribué' end def self.available_at(date, without_zones = []) (Zone.all - without_zones).filter { |zone| zone.available_at?(date) }.sort_by { |zone| zone.label_at(date) } .map do |zone| OpenStruct.new(id: zone.id, label: zone.label_at(date)) end end def self.default_for(tchap_hs) sanitized_sql = ActiveRecord::Base.sanitize_sql "'#{tchap_hs}' = ANY (tchap_hs)" Zone.where(sanitized_sql) end end