Как смоделировать «встречи» в Rails? - PullRequest
3 голосов
/ 28 декабря 2010

Вот сценарий, с которым я столкнулся:

Назначение встречи может быть назначено на:

  1. сегодня
  2. некоторое время в течение недели
  3. на конкретную дату

Итак, атрибуты могут быть разными для каждого «типа» встречи.

Я думал об этих моделях и использовал их с ИППП, но я 'я не уверен, что я на правильном пути:

class Appointment < ActiveRecord::Base
class TodayAppointment < Appointment
class WeekAppointment < Appointment
class SpecificDateAppointment < Appointment

Таблица:

string,   Type      #type of the appointment (TodayAppointment, WeekAppointment...)
datetime, When      #data used when type field is "SpecificDateAppointment"
string,   Something #used when type field is "TodayAppointment"

Какой лучший способ смоделировать это?

Это хорошийкандидат на наследование одной таблицы?

ОБНОВЛЕНИЕ

Спасибо @Mike, @SpyrosP за помощь до сих пор.Я предложил варианты, которые у меня есть ниже.

Это «представления» таблиц базы данных и их внешний вид.

Какой из них кажется наиболее подходящим?

------------------------------------------------------------------------
Option A--(Polymorphic Association)
------------------------------------------------------------------------
|patients               |   day_appointments    |   week_appointments
|   appointment_type    |   data                |   data
|   appointment_id      |                       |
------------------------------------------------------------------------
Option B--(Child references parent) (What is this pattern called?)
------------------------------------------------------------------------
|patients               |   day_appointments    |   week_appointments
|                       |   patient_id          |   patient_id
------------------------------------------------------------------------
Option C--(Polymorphic Association + Single Table Inheritance of appointments)
------------------------------------------------------------------------
|patients               |   appointments        |
|   appointment_type    |   type                |
|   appointment_id      |   day_data            |
|                       |   week_data           |
------------------------------------------------------------------------
Option D--(Child references parent + Single Table Inheritance of appointments)
------------------------------------------------------------------------
|patients               |   appointments        |
|                       |   type                |
|                       |   day_data            |
|                       |   patient_id          |
------------------------------------------------------------------------

Ответы [ 2 ]

1 голос
/ 28 декабря 2010

Вы близки, но похоже, что вы могли бы выиграть от использования Наследование таблиц классов .Я рассуждаю так: у вас есть разные атрибуты для каждого конкретного типа.

Вот пример кода в ванильном Ruby.Я полагаю, что это намного легче понять, чем любое описание, которое я могу дать.

class Appointment
    def persist
        raise "Must be implemented."
    end
end

class TodayAppointment < Appointment
    def persist
        TodayAppointmentMapper save self
    end
end

class WeekAppointment < Appointment
    def persist
        WeekAppointmentMapper save self
    end
end

class Mapper
    def save aAppointment
        raise "Must be implemented."
    end
end

class TodayAppointmentMapper < Mapper
    def save aAppointment
        # Specfic Today Appointment persistence details.
    end
end

class WeekAppointmentMapper < Mapper
    def save aAppointment
        # Specfic Week Appointment persistence details.
    end
end

Обратите внимание на возможность для каждого конкретного типа прозрачно выбирать соответствующий картограф.Рассмотрите возможность объединения этого с Внедрением зависимостей для упрощения тестирования.

0 голосов
/ 28 декабря 2010

Я еще не использовал их, чтобы быть искренним, но, похоже, вам нужны полиморфные модели.

http://railscasts.com/episodes/154-polymorphic-association

Посмотри пожалуйста. Это способ создать полиморфную модель для разных случаев, как в вашем примере.

...