Rails: шаблон проектирования для хранения порядка отношений - PullRequest
0 голосов
/ 12 мая 2010

У меня есть четыре модели: Клиент, QueueRed, QueueBlue, QueueGreen.

Модели Queue имеют отношения один-ко-многим с клиентами

Клиент всегда должен быть в очереди

Клиент может быть только в одной очереди за раз

Клиент может изменить очереди

Мы должны быть в состоянии узнать текущую позицию клиентов в их соответствующей очереди

В объектной модели очереди будут просто иметь свойство массива, содержащее клиентов, но ActiveRecord не имеет массивов.

В БД я бы, вероятно, создал несколько дополнительных таблиц просто для обработки порядка историй в очереди.

Мой вопрос: каков наилучший способ моделирования отношений в ActiveRecord? Очевидно, есть много способов сделать это, но как лучше или лучше всего использовать ActiveRecord?

Приветствия

Chris

Ответы [ 3 ]

3 голосов
/ 12 мая 2010

Я бы предложил создать только две модели: Клиент и Очередь.

Таблица очередей должна состоять из: 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
2 голосов
/ 30 июня 2010

Это комментарий / дополнение к принятому ответу выше.

acts_as_list не предназначен ни для чего, кроме прототипа, и из коробки он не обрабатывает параллелизм или целостность данных вообще По крайней мере, вы должны установить уровень изоляции на сериализуемый! Вот короткий экран с дополнительной информацией и некоторыми обходными путями.

2 голосов
/ 12 мая 2010

Вероятно, вам стоит поискать плагин acts_as_list .

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...