Model
用户系统:可以用单表继承,Store(商户) 和 Customer(顾客) model 都继承 User model;
订单系统:Order(预约) model,关键字段有 creator_id (下单者) 和 target_id(被预约者)
Relation
User model 指定与订单的关系:
has_many :own_orders, dependent: :destroy, foreign_key: :creator_id, class_name: "Order"
has_many :appointed_orders, dependent: :destroy, foreign_key: :target_id, class_name: "Order"
Order model 不需写 belong_to ,因为我们还不知道 creator 是 Store 还是 Customer(下文会提到如何找 creator 和 target)
Store 和 Customer model 继承了 User,所以也继承了与订单的关系
Usage
订单记录创建
商户预约顾客:
order = Order.create(creator_id: store.id, target_id: customer.id)
顾客预约商户:
order = Order.create(creator_id: customer.id, target_id: store.id)
查询
通过订单记录查预约者和被预约者:
通过 order 记录可查询预约者和被预约者:实现你所列的第二点 (标明每个预约是哪位商户、哪位顾客参与),具体如下:
# 查询预约者:
user = User.find(order.creator_id)
(user.type == "store")? (creator = Store.find(user.id)) : (creator = Customer.find(user.id))
# 查询被预约者同理
用户 (商户或者顾客) 查询自己参与的所有订单:
通过 store 或者 customer 记录可查询参与的所有预约:实现你所列的第四点 (返回该用户参与的所有 Appointment),具体如下:
owner_order = user.own_orders
appointed_orders = user.appointed_orders
写到一半还想到了另外一种方案:
用户系统不变,订单 model 不变,另外加一个 user_order 中间表记录 order_id, owner_id 和 target_id
注 以上思路均没实践过,可能有纰漏。不过用 Rails 写个 demo 也很快
demo