我正在使用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
排序&#34;截止日期&#34;和&#34;位置&#34;值很好,但有些原因,我无法通过在我的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"}
]
答案 0 :(得分:1)
好的,所以如果你只需要按deadline_date
排序,那就按它排序:
program_requirements.sort_by { |a| a.deadline_date.to_s }
由于并非每个program_requirement
都包含此字段,因此您需要将所有nil
转换为字符串,以便可以将它们相互比较。这样,不包含program_requirement
的所有deadline_date
将被分组在顶部,其他所有人将在到达底部的路上进行排序。