Ruby'.find'方法只返回第一次出现

Gra*_*man 9 ruby ruby-on-rails

我有如下模型:用户has_many目标,目标has_many任务,任务has_many day_tasks.我正在尝试编写一个找到所有day_tasks的方法

  1. 属于某个用户
  2. :target_date == Date.today(target_date处于day_tasks表中的列).

我想把结果放到@day_tasks数组中.

我的代码:

@user = current_user
@day_tasks = DayTask.find { |x| x.task.goal.user == @user && x.target_date == Date.today }
Run Code Online (Sandbox Code Playgroud)

此代码仅返回符合这些条件的第一条记录.我也尝试使用DayTasks.where方法在大括号中使用相同的代码,但我只是"错误的参数数量(0表示1)"错误.有人可以解释为什么我的方法只返回第一次出现以及.find和.where之间究竟有什么区别?

Rya*_*igg 14

你写了这个:

@day_tasks = DayTask.find { |x| x.task.goal.user == @user && x.target_date == Date.today }
Run Code Online (Sandbox Code Playgroud)

find这里的方法实际上是回退到Enumerable's find,它是一个别名detect,它接受一个块并返回该集合中与块条件匹配将返回的第一个元素nil.

为了解决这个问题,你需要使用内置于ActiveRecord的ARel查询内容.

DayTask.joins(:task => { :goals => :user }).where("users.id = ? AND day_tasks.target_date = ?", @user.id, Date.today)
Run Code Online (Sandbox Code Playgroud)

joins此处的方法将连接与模型和相关模型中的关联名称匹配的表DayTask.这意味着您必须taskDayTask模型上具有goals关联,并且该模型具有关联,并且目标模型上具有关联user.

然后,where将构造一个SQL条件,该条件将查询联接以查找属于用户且具有target_date今天的所有记录.