Rails按动态字段排序/分组

时间:2015-09-12 19:17:39

标签: ruby-on-rails ruby sorting sinatra

我正在使用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"}
]

1 个答案:

答案 0 :(得分:1)

好的,所以如果你只需要按deadline_date排序,那就按它排序:

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

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

相关问题