更快的数据库用于轨道可用性日历



我正在在Rails Hostel床预订系统上建造一个红宝石,我正在寻找一种更好的加载可用性日历的方法。以下代码非常适合显示床可用性(请参阅附件图像(,但是我觉得数据库调用在服务器上太征税的多个,并且必须有更快的方法来处理数据。

模型:

user.rb

bed.rb(user_id,name(

guest.rb(user_id,姓名,电话,地址,电子邮件(

porvervation.rb(user_id,bed_id,guest_id,date(

用户是旅馆所有者。他们创建的床与业务一样多,并给他们起一个名字(床#1,床#2,双及其两层楼等(。

(。

每个用户都有很多客人,这些人是在特定日期在旅馆里睡觉的人。

使用Simple_calendar Gem,我获得了本月的所有预订,并处理它们以显示每周的视图。

排序逻辑:

步骤1。一周的第一天通过Current_user的床迭代。(Simple_calendar每天提供预订(

步骤2。

步骤3。

步骤4。

正如我所说,下面的代码可以正常工作,但是当用户有50张床时,每天都可以打电话50张,因此为7天的日历进行350(如果需要找到来宾的名字(。

请让我知道您是否需要更多信息或解释。谢谢!

= week_calendar events: @monthly_reservations, attribute: :date do |date, appts|
  - current_user.beds.each do |bed|
    - if bed.reservations.where(date: date).first != nil
      - guest_name = bed.reservations.where(date: date).first.guest.abbreviated_name
        %p{style: "border: 1px solid black; padding: 5px; font-size: 10px;"}
          = "#{bed.name}: #{guest_name}"
    - else
      %p{style: "border: 1px solid black; padding: 5px; font-size: 10px;"}
        = "#{bed.name}: Empty"

当前的轨道宿舍预订系统

编辑:理想的日历布局看起来像以下图:

理想的轨道床预留系统

但是,问题是使床名与正确的床预订一致。如果5月2日只有2个预订,即1床和床4,则该代码不知道要在最后插入床4之前留下两个空位。有意义吗?

编辑#2:

@davidaldridge,类似的东西:

这样的东西?

reservs = {"[2017-05-01, bed_1]" => "guest_23", "[2017-05-01, bed_2]" => "empty"}

编辑3 这是日志上加载旅馆时的样子。

Bed Load (0.3ms)  SELECT "beds".* FROM "beds" WHERE "beds"."user_id" = $1  [["user_id", 1]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 1], ["date", "2017-07-02"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 2], ["date", "2017-07-02"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 3], ["date", "2017-07-02"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 4], ["date", "2017-07-02"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 5], ["date", "2017-07-02"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 1], ["date", "2017-07-03"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 2], ["date", "2017-07-03"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 3], ["date", "2017-07-03"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 4], ["date", "2017-07-03"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 5], ["date", "2017-07-03"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 1], ["date", "2017-07-04"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 2], ["date", "2017-07-04"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 3], ["date", "2017-07-04"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 4], ["date", "2017-07-04"]]
  Reservations Load (0.1ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 5], ["date", "2017-07-04"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 1], ["date", "2017-07-05"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 2], ["date", "2017-07-05"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 3], ["date", "2017-07-05"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 4], ["date", "2017-07-05"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 5], ["date", "2017-07-05"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 1], ["date", "2017-07-06"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 2], ["date", "2017-07-06"]]
  Reservations Load (0.1ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 3], ["date", "2017-07-06"]]
  Reservations Load (0.1ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 4], ["date", "2017-07-06"]]
  Reservations Load (0.3ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 5], ["date", "2017-07-06"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 1], ["date", "2017-07-07"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 2], ["date", "2017-07-07"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 3], ["date", "2017-07-07"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 4], ["date", "2017-07-07"]]
  Reservations Load (0.1ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 5], ["date", "2017-07-07"]]
  Reservations Load (0.2ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 1], ["date", "2017-07-08"]]
  Reservations Load (0.6ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 2], ["date", "2017-07-08"]]
  Reservations Load (0.3ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 3], ["date", "2017-07-08"]]
  Reservations Load (0.3ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 4], ["date", "2017-07-08"]]
  Reservations Load (0.3ms)  SELECT  "reservations".* FROM "reservations" WHERE "reservations"."bed_id" = $1 AND "reservations"."date" = $2  ORDER BY "reservations"."id" ASC LIMIT 1  [["bed_id", 5], ["date", "2017-07-08"]]

编辑4 遵循@DavidalDridge的建议,我在控制器中创建了一个哈希,并将其传递到了我的视图中。结果很出色!

控制器代码:

@reservations = {}
@monthly_reservations.each do |x|
  @reservations[[x.date,x.bed_id]] = x.guest.try(:name)  
end

和视图代码:

= week_calendar events: @monthly_reservations, attribute: :date do |date, appts|
  - current_user.beds.each do |bed|
    - if @reservations[[date, bed.id]] != nil
      %p{style: "border: 1px solid black; padding: 5px; font-size: 10px;"}
        = "#{bed.name}: #{@reservations[[date, kennel.id]]}"
    - else
      %p{style: "border: 1px solid black; padding: 5px; font-size: 10px;"}
        = "#{bed.name}:"

罗比(Robbie(所描述的是批量捕获数据以在第二次通过。您可以这样做:

@reservations = Reservations.where(bed_id: [ ... ], date: (from..to)).group_by do |r|
  [r.bed_id, r.date]
end

在此返回一个单数结构的地方,该结构应包含所有预订的方式,该方式可以轻松使用bed_id和日期索引。如有必要,您可以将其变成两层结构,但通常不是。

迭代时:

- current_user.beds.each do |bed|
  - reservation = @reservations[[bed.id,date]]
  - if reservation
    # ...

当您处理加载链中includes(..)元素无法轻松表达的复杂的相互依赖性时,这种有选择性但积极的急切加载记录通常会很好地工作。

另外,请记住在Ruby中,只有两件事在逻辑上是错误的:字面的falsenil。其他所有内容在逻辑上评估,包括0,空字符串,阵列和哈希。因此,比较!= nil几乎总是无关紧要且令人困惑,尤其是当您像unless (x != nil)一样双重束缚时。

如果您希望能够解决许多任意日期 床与数据库,您可以制作某种预订键,该预订键是日期和床_ID的组合,那么扫描要容易得多对于这些。您可以执行WHERE booking_token IN (...),并将其索引,表演和简洁。虽然需要进行一些预先计划才能正确做到这一点。YYYY-MM-DD-bed_id可以用作第一次通过。

对于您的查看代码,我会尝试:

= week_calendar events: @monthly_reservations, attribute: :date do |date, appts|
  - current_user.beds.each do |bed|
    %p{style: "border: 1px solid black; padding: 5px; font-size: 10px;"}
      = [bed.name, @reservations[[date, bed.id]]].compact.join(":")

最新更新