【问题标题】:Get next/previous record in Collection by Date in Rails (and handle multiple dates on the same day)在 Rails 中按日期获取下一个/上一个记录(并在同一天处理多个日期)
【发布时间】:2019-12-27 17:19:00
【问题描述】:

我在尝试隔离集合中的下一条/上一条记录时遇到问题。我是自学成才,对 Rails/编码比较陌生。

我有一个包含许多 GoalTask​​s 的 Goal 类。

GoalTask​​ 有 taskduedate。我希望能够根据他们的 taskduedate 在goal_tasks 上循环下一个/上一个。

问题是任务截止日期正好是任务应该完成的时间,但它可以随时设置,可能不是按顺序排列,所以我不知道该按什么顺序排列正确循环。

我创建了一个目标任务数组来确定当前正在查看哪个任务(例如任务:3/20),所以我可以使用它转到下一个任务,我认为这里可能有一个解决方案,但它在视图/控制器中处理它感觉不对?

我已经从 stackoverflow 尝试了以下解决方案,但它无法处理我在同一天有多个目标任务到期的事实,如果我单击下一步,它只会转到目标任务到期的第二天。例如如果我今天有三项任务要完成,而我在第一项上并单击下一步,它将跳过今天的其他两项。

然后我尝试添加 >=(如下所示)以尝试拉下一个任务(包括同一天的任务),并且我尝试通过执行 where created_at is not the same as 来忽略当前任务当前的goal_task和where.not,但我还没有成功地让它按照我想要的方式循环,我想有一个更好的解决方案。

GoalTask​​sController:

 def show
   @all_tasks_ordered_due_date_desc = @goal.goal_tasks.order('taskduedate ASC', 'id ASC')
 end

show.html.erb:

Task: <%= @all_tasks_ordered_due_date_desc.find_index(@goal_task) +1 %> /      
<%= @goal.goal_tasks.count%>

目标任务.rb

scope :next_task, lambda {|taskduedate| where('taskduedate >= ?', taskduedate).order('id ASC') } 
scope :last_task, lambda {|taskduedate| where('taskduedate <= ?', taskduedate).order('id DESC') } 

  def next_goal_task
    goal.goal_tasks.next_task(self.taskduedate).first
  end

谢谢

【问题讨论】:

    标签: ruby-on-rails ruby postgresql activerecord


    【解决方案1】:

    我使用了这里找到的方法:Rails 5: ActiveRecord collection index_by

    这意味着添加一个默认范围并将 GoalTask​​.rb 更改为:

      default_scope { order('taskduedate ASC') }
    
      def next_goal_task
        index = goal.goal_tasks.index self
        goal.goal_tasks[index + 1]
      end
    
      def last_goal_task
        index = goal.goal_tasks.index self
        goal.goal_tasks[index -1]
      end
    

    【讨论】:

      猜你喜欢
      • 2012-12-11
      • 2022-12-04
      • 2016-03-24
      • 1970-01-01
      • 2023-04-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多