我的模型如下:用户has_many目标,目标has_many任务,任务has_many day_tasks。我正在尝试编写一个找到所有day_tasks
的方法: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 }
此代码仅返回符合这些条件的第一条记录。我也尝试使用DayTasks.where方法在大括号中使用相同的代码,但我只是“错误的参数数量(0表示1)”错误。有人可以解释为什么我的方法只返回第一次出现以及.find和.where之间的区别究竟是什么?
答案 0 :(得分:14)
你写了这个:
@day_tasks = DayTask.find { |x| x.task.goal.user == @user && x.target_date == Date.today }
此处的find
方法实际上是回退到Enumerable
的{{1}},find
是detect
的别名,它占用了一个块并将返回第一个元素在该集合中,匹配块的条件或将返回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()