【问题标题】:How to properly order dates from my app's database如何从我的应用程序数据库中正确排序日期
【发布时间】:2019-11-25 18:18:30
【问题描述】:

我无法从数据库中提取事件日期以按正确顺序呈现。我在我的 simple_form 中使用 bootstrap-datepicker 供用户使用。我的事件控制器目前是:

 ```def index
        @events = Event.order(start_date: :asc).where('start_date::date >= CURRENT_DATE')
    end```

事件确实会以正确的日期呈现到页面上,但它们似乎只是按月排序而忽略了年份。例如,2021 年 1 月发生的事件将列在 2020 年 3 月之上,因为 1 月在 3 月之前。

我尝试寻找 ruby​​ 中的 order 方法如何工作以及搜索其他帖子,但我没有成功。有什么想法吗?

日志:

```Started GET "/events" for ::1 at 2019-11-25 10:26:28 -0800
Processing by EventsController#index as HTML
  Rendering events/index.html.erb within layouts/application
  User Load (0.3ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/views/events/index.html.erb:10
  Event Load (0.3ms)  SELECT "events".* FROM "events" WHERE (start_date::date >= CURRENT_DATE) ORDER BY "events"."start_date" ASC
  ↳ app/views/events/index.html.erb:27
  Rendered events/index.html.erb within layouts/application (4.4ms)
Completed 200 OK in 174ms (Views: 171.2ms | ActiveRecord: 0.6ms)```

application.js:

```//= require rails-ujs
//= require activestorage
//= require jquery
//= require jquery_ujs
//= require popper
//= require tether
//= require bootstrap-sprockets
//= require_tree .
//= require bootstrap-datepicker
$(function() {
    $('input.datepicker').data({behaviour: "datepicker"}).datepicker();
});```

simple_form:

```<div class="event-box col-5 offset-3">
    <br/>
    <h1 align="center" style="font-size: 25px;">Create New Event</h1>
    <%= simple_form_for @event do |f| %>
        <%= f.input :title %>
        <%= f.input :start_date, as: :string, input_html: { class: "datepicker" }%>
        <%= f.input :end_date, as: :string, input_html: { class: "datepicker" }%>
        <%= f.input :location %>
        <%= f.input :details %>
        <br />
        <div align="center">
            <%= f.submit 'Create', class: 'btn btn-primary' %>
        </div>
    <% end %>   
    <br/>
</div>

<script>
$('#datepicker').datepicker({format: 'mm-dd-yyyy'});
</script>```

事件表:

```create_table "events", force: :cascade do |t|
    t.string "title"
    t.string "start_date"
    t.string "end_date"
    t.string "location"
    t.text "details"
    t.integer "event_id"
    t.datetime "created_at", null: false
    t.datetime "updated_at", null: false
    t.string "event"
    t.index ["event_id"], name: "index_events_on_event_id"
  end```

【问题讨论】:

  • 能否添加在加载视图时在控制台中运行的查询
  • 和服务器上放的信息一样吗?
  • 当您加载页面时,它应该向您显示日志中正在运行的确切查询。当您使用活动记录在日志中构建查询时,它会向您显示 SELECT * FROM events WHERE 'start_date::date&gt;=CURRENT_DATE' ORDER BY start_date ASC
  • 糟糕,从最后一条评论开始。我明白你在做什么。看起来查询是正确的,您确定没有前端正在修改订单吗?有 JS 吗?
  • 我会检查我的文件并用任何相关的内容编辑帖子

标签: ruby-on-rails ruby postgresql


【解决方案1】:

这里的问题是start_date 被保存为字符串而不是时间。当您尝试按字符串排序时,它只是按字母顺序排列输出,因此所有 1 月都被组合在一起。

如果你改变:

t.string "start_date"

到:

t.date_time "start_date"

它应该工作。您显然必须迁移现有数据。

【讨论】:

  • 谢谢!我去试试
  • 这似乎行得通!我从没想过需要更改列类型。非常感谢!
  • 数据库中正确的字段定义使数据库的行为和执行方式大不相同。阅读 DBM 教程以了解如何创建模式非常重要,否则您可能会编写一个缓慢运行、消耗大量 CPU 或磁盘的应用程序,或者非常不灵活,除了最基本的要素之外什么都做不了。
猜你喜欢
  • 1970-01-01
  • 2018-01-29
  • 1970-01-01
  • 1970-01-01
  • 2020-06-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多