Gra*_*man 9 ruby ruby-on-rails
我有如下模型:用户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 }
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.这意味着您必须task在DayTask模型上具有goals关联,并且该模型具有关联,并且目标模型上具有关联user.
然后,where将构造一个SQL条件,该条件将查询联接以查找属于用户且具有target_date今天的所有记录.
| 归档时间: |
|
| 查看次数: |
21241 次 |
| 最近记录: |