繁体   English   中英

Rails没有按日期对该查询排序

[英]Rails not ordering by date for this query

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

# 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模型中有一个默认范围,该范围按日期,start_time和end_time排序。

# 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

但是然后我就很难在每个时间表中只显示一个孩子的名字,因为一个班级时间表可以有很多与之相关的孩子。

救命?

您已经为Schedule的默认范围定义了一个顺序,但是您正在从Reservation中拉出关系。 结果,将按照指定的顺序查询日程表,但是由于您大概是在视图中遍历@reservations ,因此您会看到它们的顺序,而不是它们的schedules的顺序。 您可以按schedules表上的字段对@reservations进行排序, @reservations所示:

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

还要注意,通常不建议在模型中定义default_scope在SO其他地方 ),因为它难以管理,并且可能导致意外和不直观的影响,尤其是在将来。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM