来自 ActiveRecord 关联的查询结果的自定义排序

Custom ordering for query results from ActiveRecord association

我最近将我的项目切换到 postgres,它以小而烦人的方式弄乱了我的 select 表单。

我有 2 个 select 字段,

<%= f.collection_select :state,  State.all, :value, :name, {include_blank: '- Select State -'} %>
<%= f.grouped_collection_select :area,  State.all, :areas, :name, :value, :name, {include_blank: '- Select Area -'} %>

第一个 select 字段包含一堆状态。第二个 select 字段包含一堆 Areas/Districts 按国家分组(optgroup)。

使用"seeds.rb",我插入了所有相关数据。一切都按字母顺序插入。 在 SQLite3 中,select 结果都是按字母顺序显示的。 但是,当我切换到 Postgrsql 时,我的 :area select 现在以相反的字母顺序显示其选项,这对用户体验来说很糟糕。

我还在 rails 控制台中使用以下查询测试了以下场景:

State.find("Texas").areas

SQLite3 结果:

[Area A, Area B, Area C]

Postgres 结果:

[Area C, Area B, Area A]

有什么方法可以让我在 "f.group_collection_select" 中使用 Postgres 获得与 SQLite3 相同的结果?

您可以在 has_many 关系中指定默认顺序。

class State < ActiveRecord::Base
  has_many :areas, -> { order("areas.name ASC") }
end

在名称或 ID 上使用适当的顺序子句(我更喜欢名称)和区域的默认范围。

default_scope { order(:name :asc) }

您可以通过在 Area 模型中定义一个范围来做到这一点

参见:Grouped Collection Select Alphabetical Order Rails