我正在开发一个Rails 4应用程序,我有两个模型。一个称为Project
,另一个称为Task
。
Project
有很多Tasks
。
Task
属于Project
。
任务对象具有starts_at
和ends_at
属性(日期时间)。
如何获得属于特定项目的所有相关任务的最早starts_at
和最新ends_at
?
我尝试了@project.tasks.max(:starts_at)
但它无法正常工作(出错)。
答案 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