【问题标题】:Ruby-on-rails Postgres queryRuby-on-rails Postgres 查询
【发布时间】:2019-01-08 02:38:01
【问题描述】:

我有一个用于酒店的 ruby​​ on rails 应用程序,该应用程序有一个房间页面。酒店房间可以为他们打开不同种类的门票,在我的房间视图中,房间号会显示出来,我在我的助手中使用这个查询来获取单个房间的门票数量

helper/room.rb
SELECT COUNT(*) FROM "tickets" WHERE "tickets"."room_id" = ? AND (status = ? OR status = ? )

room.slim

- @rooms.each do |floor_number, rooms|

  - if rooms.present?
    h1.separator
      - if (@current_view.eql? "room_type") || (params[:action].eql? "room_type")
        span= floor_number
      - else
        span= "Floor-#{floor_number}"

   .cards-container
      - rooms.each do |room|

= link_to get_show_page_url(room) do
            .col-md-3.room-card_room.new-floor-other{ style="background-color:#{card_background_color(room, @maintenance_type, @inspection_type)}" }
              .new-floor-inner
                  - if room.occupy_or_dnd? && (!@current_view.eql? "maintenance") && (!@current_view.eql? "inspection")
                    span
                      - if room.dnd?
                        = image_tag('dnd', class: "guest-occupy-img")
                      - else
                        = image_tag('man_to_white', class: "guest-occupy-img")

                  h4= room.location
                  - if (@current_view.eql? "maintenance") || (@current_view.eql? "inspection")
                    h6.room_status
                      | (
                      = last_maintained(room, @maintenance_type, @inspection_type)
                      | )

              span.room_hilton_honors= room.hilton_honors
              - count = room.open_tickets_count || 0
              - if count > 0 && (!@current_view.eql? "maintenance") && (!@current_view.eql? "inspection")
                span.circle = count

room_controller
before_action :get_room, only: [:show, :update]
def get_room
      @room = Room.find_by_id(params[:id])
      @featured_tickets = ImportTicket.where(request_type: "PREVENTIVE MAINTENANCE", featured:true)
    end

room.open_tickets_count 是多次触发的查询,open_tickets 在帮助程序内部定义,计数显示该房间的票数

这很好用,但就性能而言,它会产生更多的处理时间,因为在单个请求中会多次触发单个查询。好像有 100 个房间,查询被触发 100 次以检查每个房间的门票总数

有没有一种方法可以让我在良好的性能时间内实现这一目标?

【问题讨论】:

  • 为什么不在一次查询中加载所有房间的所有票?请详细说明您如何触发查询以及如何使用结果。
  • 我正在使用 for 循环来获取要显示的房间数量,并从循环内部调用该查询,使用房间 ID 作为当前在循环中的房间号 @spickermann,我这样做是为了只计算那个特定房间的票数
  • 您能否编辑您的问题,向我们展示您如何选择要显示的房间?
  • 在控制器中设置@room,但视图使用“@rooms”。这没有意义。

标签: ruby postgresql ruby-on-rails-5


【解决方案1】:

我假设您有一个包含所有房间 ID 的变量。然后你可以使用where 和这个数组,countgroup

Ticket.where(room_id: room_ids).group(:room_id).count

返回将如下所示:

{ 1 => 5, 2 => 3 }

这意味着房间 1 有 5 张票,房间 2 有 3 张票。

【讨论】:

  • 不,我没有,我已经在我的控制器中完成了Room.all,并在视图中使用了rooms.each,并在视图本身中获取了id @spickermann
  • Ticket.all.group(:room_id).count 可能吗?似乎您正在获取所有房间的数据,是吗?
  • 更改帮助查询不会有帮助,因为我使用该帮助查询是因为它无论如何都会触发帮助查询 n 次,因为我在 for 循环中调用该查询
  • 如果我创建一个数组,我将如何将索引值与该特定房间号匹配以在我的视图中获取计数变量中的计数值,我已经更新了我的问题,显示我如何使用我的助手我的视图中的方法查询@spickermann
  • 是的,在我看来,我正在获取房间桌子的所有数据,因为我必须使用多个过滤器(例如按楼层等)来显示它。@AryeDovEidelman
猜你喜欢
  • 2016-08-26
  • 1970-01-01
  • 2012-12-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多