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

时间:2011-10-04 22:08:26

标签: ruby-on-rails ruby

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

的方法
  1. 属于某个用户
  2. :target_date == Date.today(target_date是day_tasks表中的一列)。
  3. 我想将结果放入@day_tasks数组。

    我的代码:

    @user = current_user
    @day_tasks = DayTask.find { |x| x.task.goal.user == @user && x.target_date == Date.today }
    

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

2 个答案:

答案 0 :(得分:14)

你写了这个:

@day_tasks = DayTask.find { |x| x.task.goal.user == @user && x.target_date == Date.today }

此处的find方法实际上是回退到Enumerable的{​​{1}},finddetect的别名,它占用了一个块并将返回第一个元素在该集合中,匹配块的条件将返回nil

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

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

此处的joins方法将加入与DayTask模型和相关模型中的关联名称匹配的表格。这意味着您必须在task模型上拥有DayTask关联,并且该模型上有goals关联,并且目标模型上有一个user

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

答案 1 :(得分:1)

请检查Rails 3.x的ActiveRecord查询接口:

http://m.onkey.org/active-record-query-interface

http://guides.rubyonrails.org/active_record_querying.html

你可能想要find(:all,...)或where()