如何获取关联对象的最早和最晚日期

时间:2015-01-22 14:54:57

标签: ruby-on-rails ruby-on-rails-4 rails-activerecord

我正在开发一个Rails 4应用程序,我有两个模型。一个称为Project,另一个称为Task

Project有很多TasksTask属于Project

任务对象具有starts_atends_at属性(日期时间)。 如何获得属于特定项目的所有相关任务的最早starts_at和最新ends_at

我尝试了@project.tasks.max(:starts_at)但它无法正常工作(出错)。

3 个答案:

答案 0 :(得分:3)

使用maximum代替max

max适用于数组最大值:[1,2].max == 2

http://api.rubyonrails.org/classes/ActiveRecord/Calculations.html#method-i-maximum

答案 1 :(得分:0)

改编自 [Lars Haugseth's solution]以寻找下一个生日。

model.rb

def latest_tasks
  todays_date = Date.today
  start_days_from_now = todays_date - starts_at
  ends_days_from_now = ends_at - todays_date
  if start_days_from_now < ends_days_from_now
    yearmmdd = starts_at.strftime('%Y%m%d')
  else
    yearmmdd = ends_at.strftime('%Y%m%d')
  end
  return Date.parse("#{yearmmdd}")
end

Controller.rb

@project.tasks.where('starts_at >= ? or ends_at >=? ', Date.today, Date.today).sort_by(&:latest_tasks)

答案 2 :(得分:0)

我知道这是一个老问题,但对于任何想要实现这一目标的人来说,你可以这样做:

  • starts_at获取所有ends_at@project.tasks值的数组:

    starts_at_values = @project.tasks.pluck(:starts_at)

    ends_at_values = @project.tasks.pluck(:ends_at)

  • 选择Task值最早的starts_at记录:

    earliest_task = @project.tasks.select{|task| task.starts_at == starts_at_values.min}

  • 选择Task值为最新值的ends_at记录:

    latest_task = @project.tasks.select{|task| task.starts_at == ends_at_values.max}

如果您只需要获得最早和最晚的时间,您可以这样做:

earliest_time = starts_at_values.min

latest_time = ends_at_values.max