【问题标题】:Rails Sort/Group by dynamic fieldRails 按动态字段排序/分组
【发布时间】:2015-09-12 19:17:38
【问题描述】:

我正在开发一个 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,但这似乎也没有达到我的预期。我只想按相等的截止日期(如果存在)对需求进行分组,然后按其他两个静态字段对其余部分进行排序。

感谢任何帮助!

更新

输出来自: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"}
]

【问题讨论】:

  • I'm unable to sort by including a param into my sort_by method 是什么意思,你得到什么结果?有任何错误消息,还是只是排序不正确?
  • @AlexeyShein 很抱歉造成混淆 - 不会产生错误,但如果我没有包含该参数,则数组的排序方式没有任何区别。现在我考虑一下 - 问题可能是因为“deadline_dates”存储为字符串而不是日期,因此它可能无法识别我希望字符串在它们包含的内容上与相等长度..
  • 好吧,他们至少必须遵守字符串排序,如果他们都是日期,他们应该有相同的长度,比如2015-09-13(我不知道你使用的是什么格式: ) )
  • 是的,我知道发生了什么,但我不确定这是否应该在服务器上修复。如果它们存在,我必须将截止日期转换为实际日期并进行比较。我遇到的情况是,如果您创建一个日期为“2001”的需求,然后使用“2002”创建另一个需求,然后再创建另一个对于“2001”,由于字符串的长度相同,因此它们实际上被分组为 2001,2002,2001,而不是将两个 2001 组合在一起。对不起,如果我有点不清楚 - 仍然掌握轨道。
  • 好的,所以每个program_requirementfields[:deadline_date] 列中存储1 个或多个日期?能否更新一个输出为program_requirements.each { |pr| p pr.fields[:deadline_date] } 的问题?

标签: ruby-on-rails ruby sorting sinatra


【解决方案1】:

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

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

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

【讨论】:

  • 哦,太简单了!非常感谢您的帮助!
  • 我很惊讶你没有亲自尝试!顺便说一句,没有.to_s 构造它可以工作吗?我对store_accessor 构造不太熟悉。
  • 我有点困惑 ruby​​ 的 sort_by 方法是如何工作的。我的印象是,除非我使用 to_date 方法转换字符串,否则它不会正确地按截止日期对字符串进行排序,这是我一直在尝试的。在不使用 to_s 的情况下,手动截止日期被组合在一起,但它们是按照它们的创建顺序与截止日期顺序排列的......这对我的情况没有帮助,因为我依赖三个不同的变量来排序这个数组..
  • 感谢您的澄清!
猜你喜欢
  • 1970-01-01
  • 2013-11-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-09-03
  • 2017-06-17
相关资源
最近更新 更多