我正在在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(如果需要找到来宾的名字(。 请让我知道您是否需要更多信息或解释。谢谢! 当前的轨道宿舍预订系统 编辑:理想的日历布局看起来像以下图: 理想的轨道床预留系统 但是,问题是使床名与正确的床预订一致。如果5月2日只有2个预订,即1床和床4,则该代码不知道要在最后插入床4之前留下两个空位。有意义吗? 编辑#2: @davidaldridge,类似的东西: 这样的东西? 编辑3 这是日志上加载旅馆时的样子。 编辑4 遵循@DavidalDridge的建议,我在控制器中创建了一个哈希,并将其传递到了我的视图中。结果很出色! 控制器代码: 和视图代码:= 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"
reservs = {"[2017-05-01, bed_1]" => "guest_23", "[2017-05-01, bed_2]" => "empty"}
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"]]
@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中,只有两件事在逻辑上是错误的:字面的false
和nil
。其他所有内容在逻辑上评估,包括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(":")