Kar*_*rim 3 ruby-on-rails domain-model timeslots appointment
我希望建立一个具有以下特征的预约预约应用程序: - 用户可以是服务提供商或买家 - 服务提供商设置他们的可用性(但只能提前6个月设置他们的可用性) - 然后买家可以预约约会在这些可用性上 - 基于服务类型的每个约会花费不同的时间 - 根据买方选择的约会,根据服务需要多长时间显示不同的可用性集
我构建的内容如下: - TimeSlot我根据a start_time和end_time属性创建了一些通用的30分钟时隙的模型.为了使这些时间段延长到未来6个月,我每天都有一个后台工作,创造了所有必要的新时段
class TimeSlot < ActiveRecord::Base
has_many :user_time_slots
# ... more methods below
end
Run Code Online (Sandbox Code Playgroud)
- 一种UserTimeSlots基本上代表服务提供商可以设置的可用性的模型.因此,当他们创建user_time_slot时,他们基本上是说他们当时可用.
class UserTimeSlot < ActiveRecord::Base
belongs_to :time_slot
belongs_to :service_provider, :class_name => "User"
belongs_to :appointment
end
Run Code Online (Sandbox Code Playgroud)
- Appointment具有许多user_time_slots 的模型.它有很多,因为约会属于需要一定时间(time_required服务属性)的服务,并且它可能跨越多个连续的 user_time_slots.
class Appointment < ActiveRecord::Base
has_many :user_time_slots
belongs_to :buyer, :class_name => "User"
belongs_to :service_provider, :class_name => "User"
belongs_to :service
end
Run Code Online (Sandbox Code Playgroud)
- Service具有许多约会并且属于创建该服务的服务提供商的模型.
class Service < ActiveRecord::Base
has_many :appointments
belongs_to :service_provider, :class_name => "User"
end
Run Code Online (Sandbox Code Playgroud)
这个领域模型有效; 但是,我想知道是否有更好的方法来做到这一点,因为以下内容:
使用后台工作每天在我的后端创建TimeSlot记录对我来说似乎有点笨拙 - TimeSlots的唯一目的是有一个开始和结束时间然后被关联.
有没有人有更好的方法或解决方案来做到这一点(特别是在寻找连续时间段的主题)?
Mik*_*man 11
看起来像一个有趣的项目.:)
我个人不会模拟"现有时间",即我没有后台工作创建"空"数据.
我会尝试这样的模型:

用户表在哪里?
我不会为两种不同的用户类型使用共享用户模型.我的直觉是,如果不是现在,他们需要变得不同,随着时间的推移,他们最需要.在我看来,它也使模型更加清晰.如果有登录或任何身份验证,我会为该特定数据添加一个User表,而服务提供者和Consumer与此有一些关系.
服务提供商管理可用性
该服务提供者只需要一个空的日历(或类似),上市仅她已经进入了服务可用性,每服务.
消费者预约
该消费者将搜索/浏览/导航服务可用性,每个服务
根据业务逻辑,即消费者是否总是安排整个定义的时间段?或者消费者可以预订首选时段.只要预订的时段在给定服务的可用时段内?
调度
因此,我们只在服务提供商管理特定服务的可用性时放入服务可用性记录.空被简单地认为不可用.
根据服务可用性,我们仅在消费者预订服务时放入约会记录.
如果消费者只能预订服务可用性时隙的一部分,我建议在剩余的时间内创建两个(或一个)新的服务可用性记录.检查时间是否可用可以通过比较服务可用性和约会来完成,但这不是最佳的.更好的是只查询服务可用性的特定服务,并得到一个可用的时间表,如果没有记录就等于没有可用性.
这里有很多ifs,具体取决于您的特定需求和请求的业务逻辑.但我希望这有助于一些灵感和想法.
我会为每个可用期限提供一个模型.每个时期都有一个start_time和end_time.它们可以在不超过6个月的时间内轻松验证,您可以检查预约是否合适.您的时段不需要属于预约; 约会将只有一个时间和服务提供商,并且所述服务提供商的可用性将改变以反映预订的约会.
class AvailabilityPeriod < ActiveRecord::Base
belongs_to :service_provider, :class_name => "User"
validates :end_time, :inclusion => { :in => Time.now..(Time.now + 6.months) }
end
Run Code Online (Sandbox Code Playgroud)
例如,您可以找到给定服务和提供商的所有可能的可用性,如下所示:
duration = @service.duration
available_times = @provider.availability_periods.where (end_time - start_time > duration)
Run Code Online (Sandbox Code Playgroud)
预约会有点棘手.您需要拆分/缩短可用期.例如,假设提供商具有以下可用性:
5月30日12:00至18:00
预约时间为5月30日14:00至16:00
旧的可用性需要删除,并由两个新的可用性替换: 5月30日12:00 - 14月5月30日16:00 - 18:00
但是在模型方法中这很容易做到.
| 归档时间: |
|
| 查看次数: |
5134 次 |
| 最近记录: |