Я бы предложил создать только две модели: Клиент и Очередь.
Таблица очередей должна состоять из: customer_id
, queue_type_id
, position
.
Вы также можете создать модель QueueType, но это не обязательно.
Модель клиента:
has_one :queue
Модель очереди:
belongs_to :customer
validates_uniqueness_of :customer_id
validates_uniqueness_of :position, :scope => :queue_type_id
named_scope :red, :conditions => {:queue_type_id => 0}
named_scope :green, :conditions => {:queue_type_id => 1}
named_scope :blue, :conditions => {:queue_type_id => 2}
Я добавил именованные области для обработки цветов очередей.
Клиент может одновременно находиться только в одной очереди
Первая проверка в модели очереди должна запретить клиенту находиться в более чем одной очереди.
Клиент может изменить очереди
@customer = Customer.first
@customer.queue.queue_type_id = 1
@customer.save
Здесь вы должны быть осторожны с position
в очереди, потому что оно должно быть уникальным по объему queue_type_id
.
Мы должны быть в состоянии узнать текущую позицию клиентов в их соответствующей очереди
customer.queue.position
В объектной модели очереди просто имеют свойство массива, содержащее клиентов, но ActiveRecord не имеет массивов.
@queue = Queue.red
Возвращает массив клиентов. Я не знаю, что вы подразумевали под "ActiveRecord не имеет массивов".
Клиент всегда должен быть в очереди
Хм, просто:
@customer = Customer.new
@customer.build_queue
?
Или вы можете добавить before_save
или, что еще лучше, простую проверку:
validate :ensure_customer_is_in_queue
def ensure_customer_is_in_queue
errors.add_to_base "Customer should be in a queue!" unless self.queue
end