【问题标题】:Rails not ordering by date for this queryRails 未按日期排序此查询
【发布时间】:2015-08-06 16:20:13
【问题描述】:

我目前正在开发一个网站,家长可以在该网站上为他们的孩子预订课程。在父母的仪表板中,我想显示一个日程表,在每一行中都会有与日程相关联的孩子的名字。不幸的是,我在父母的仪表板中按日期排序时间表时遇到问题。

# view
<% @reservations.each do |reservation| %>
  <%= reservation.child.first_name %>
  <%= reservation.schedule.date %>
  <%= reservation.schedule.start_time %> - <%= reservation.schedule.end_time %>
  <%= link_to reservation.schedule.klass.name, schedule_path(reservation.schedule) %></td>
  <%= link_to reservation.schedule.partner.company, partner_path(reservation.schedule.partner) %></td>
  <%= reservation.schedule.city.name %></td>
<% end %>

# associations
User
  has_many :children, dependent: :destroy
  has_many :reservations
  has_many :schedules, through: :reservations
Child
  belongs_to :user
  has_many   :reservations, dependent: :destroy
  has_many   :schedules, through: :reservations
Reservation
  belongs_to :child
  belongs_to :schedule
  belongs_to :user
Schedule
  belongs_to :city
  belongs_to :partner
  belongs_to :activity
  belongs_to :klass
  has_many   :reservations
  has_many   :children, through: :reservations

我的Schedule 模型中有一个默认范围,它按日期、开始时间和结束时间排序。

# Schedule model
default_scope { order(:date, :start_time, :end_time) }

此范围适用于其他表,但不适用于此查询:

# controller
@reservations = current_user.reservations.includes(:child, schedule: [:partner, :klass, :city])

它只是拒绝在浏览器中按日期和时间排序:

日志显示Schedule的查询确实是被排序的:

Reservation Load (0.3ms)  SELECT "reservations".* FROM "reservations" WHERE "reservations"."user_id" = $1  [["user_id", 1]]
Child Load (0.4ms)  SELECT "children".* FROM "children" WHERE "children"."id" IN (1, 2, 3)
Schedule Load (0.4ms)  SELECT "schedules".* FROM "schedules" WHERE "schedules"."id" IN (24, 12)  ORDER BY "schedules"."date" ASC, "schedules"."start_time" ASC, "schedules"."end_time" ASC
Partner Load (0.3ms)  SELECT "partners".* FROM "partners" WHERE "partners"."id" IN (2)
Klass Load (0.3ms)  SELECT "klasses".* FROM "klasses" WHERE "klasses"."id" IN (9, 17)
City Load (0.4ms)  SELECT "cities".* FROM "cities" WHERE "cities"."id" IN (28)

我可以在控制器中执行此查询:

@schedules = current_user.schedules

但是我会遇到问题,因为每个课程表只能显示一个孩子的名字,因为课程表可以有很多孩子与之关联。

帮助?

【问题讨论】:

  • 生成的 SQL 显示它确实按计划排序
  • 对我来说不是很清楚到底发生了什么;您希望按日程安排预订吗?
  • @Pavan 它似乎使用 Reservation 的数据库 id 进行订购。
  • 我的意思是Schedule Load (0.4ms) SELECT "schedules".* FROM "schedules" WHERE "schedules"."id" IN (24, 12) ORDER BY "schedules"."date" ASC, "schedules"."start_time" ASC, "schedules"."end_time" ASC
  • 好吧,您没有做任何影响预订订购的事情;时间表将在预订。

标签: ruby-on-rails ruby-on-rails-4


【解决方案1】:

您已经在Schedule 的默认范围上定义了一个排序,但是您正在从Reservation 中提取您的关系。结果,计划按指定的顺序查询,但由于您可能在视图中循环遍历@reservations,您会看到它们的顺序而不是schedules 的顺序。您可以按schedules 表中的字段对@reservations 进行排序,如下所示:

@reservations = @reservations.order("schedules.date ASC, schedules.start_time ASC, schedules.end_time ASC")

另请注意,通常不鼓励在模型中定义 default_scopeon SOelsewhere),因为它难以管理并且可能导致意外和不直观的影响,尤其是在未来。

【讨论】:

  • 我尝试了您的建议,它确实有效:@reservations = current_user.reservations.includes(:child, schedule: [:partner, :klass, :city]).order("schedules.date ASC, schedules.start_time ASC, schedules.end_time ASC") 但在日志中它运行了一个非常长的 SQL 查询,持续 1.4 毫秒。这正常吗?
  • @i.am.noob 1.4ms 对我来说似乎相当快。如果您想进行更快的查询,您可能需要为您的数据库添加更好的索引。如果您对此不确定,最好用您的数据库标记一个单独的问题
猜你喜欢
  • 2015-05-08
  • 2021-08-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-08
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多