Rails Sort/Group 按动态字段

Rails Sort/Group by dynamic field

我正在开发一个 rails 应用程序,它将 JSON 转储中的序列化值传递给客户端。我需要按特定顺序对需求进行排序,将包含相等 "deadline_dates" 的对象组合在一起。该字段是动态的,我的许多对象根本不包含该字段。

这是我的模型的样子:

#------ app/models/program_requirement.rb ------#
class ProgramRequirement < ActiveRecord::Base
 include HasFields

 belongs_to :program
 has_many :responses
 has_many :applications, through: :responses

 store_accessor :fields, :deadline_date
end

这是我用来将对象传递到我的序列化程序中的方法:

#------ app/models/program.rb ------#
def sorted_program_requirements
self.program_requirements.sort_by{|a| [a.deadline, a.position]}.map {
  |requirement| ProgramRequirementSerializer.new(requirement, root: false) }
end

"deadline" 和 "position" 值的排序工作正常,但由于某些原因,我无法通过将参数包含到我的 sort_by 方法中进行排序,例如:

a.fields[:deadline_date]

我尝试过使用 group_by,但这似乎也没有达到我的预期。我只想按相等 deadline_dates 对需求进行分组(如果存在),然后按其他两个静态字段对其余需求进行排序。

感谢任何帮助!

更新

输出自:program_requirements.each { |pr| p pr.fields[:deadline_date] }

[#<ProgramRequirement:0x007fb198a12d58
  id: 126,
  program_id: 1159,
  title: "Req",
  deadline: "manual",
  position: 1,
  fields: {"deadline_date"=>"2015-09-16"}
 #<ProgramRequirement:0x007fb198a12bf0
  id: 127,
  program_id: 1159,
  title: "Req",
  deadline: "initial",
  position: 2,
  fields: {}
 #<ProgramRequirement:0x007fb198a12a60
  id: 132,
  program_id: 1159,
  title: "Req",
  deadline: "precampaign",
  position: 3,
  fields: {}
 #<ProgramRequirement:0x007fb198a128d0
  id: 133,
  program_id: 1159,
  title: "t444",
  description: nil,
  deadline: "manual",
  position: 4,
  fields: {"deadline_date"=>"2015-09-16"}
]

好的,所以如果您只需要按 deadline_date 排序,好吧,按它排序:

program_requirements.sort_by { |a| a.deadline_date.to_s }

由于并非每个 program_requirement 都包含此字段,因此您需要将所有 nil 转换为字符串,以便可以相互比较它们。这样,所有不包含 deadline_dateprogram_requirement 都将被分组在顶部,其他所有人将按顺序排列到底部。