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_date
的 program_requirement
都将被分组在顶部,其他所有人将按顺序排列到底部。
我正在开发一个 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_date
的 program_requirement
都将被分组在顶部,其他所有人将按顺序排列到底部。