首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Rails -如何避免多个查询

Rails -如何避免多个查询
EN

Stack Overflow用户
提问于 2012-02-16 23:35:02
回答 1查看 222关注 0票数 1

我有一组表(我正在使用postgresql)

代码语言:javascript
复制
User (with id, first_name, ....)
Assignment (with id, name, start_date, finish_date,....)
AssignmentUser(with assignment_id, user_id, flag_status)

flag_status是一个布尔值,表示用户是否仍在分配中。

假设user1申请assignment1,assignment2,assignment3如下:

代码语言:javascript
复制
                        start_date     finish_date   flag_status
user1  assignment1      11-11-11       11-12-11      false
user1  assignment2      01-10-11       01-02-12      true
user1  assignment3      01-01-12       01-03-12      true

假设我今天想搜索用户分配的最接近的start_date。

我在我的用户模型中做到了这一点:

代码语言:javascript
复制
  def last_date
    self.assignments.where("date < ?", Date.today).max.try(:date)
  end

还有这个

代码语言:javascript
复制
def last_status
  AssignmentUser.find_by_assignment_id_and_user_id(Assignment.find_by_date(self.last_date), self.id).flag_status if self.last_date.present?
end

在我看来,对于每个用户:

代码语言:javascript
复制
User.all.each do |u|
  <td>   u.first_name   </td>
  <td>   u.last_date   </td>
  <td>   u.last_status  </td>
end

它工作得很好,但在我的日志中,我看到每个用户有3个查询(正如预期的那样)。所以我的问题是:我如何避免这些多个查询?(我想这更像是一个SQL问题,而不是Rails问题)

EN

回答 1

Stack Overflow用户

发布于 2012-02-17 00:22:56

代码语言:javascript
复制
@au = AssignmentUsers.find_by_sql(
  "SELECT assignment_users.user_id, MAX(assignment_users.date) as last_date,
   assignment_id, 
   assignments.flag_status,
   users.first_name
  FROM assignment_users
  LEFT JOIN assignments
   ON assignments.id = assignment_id
  LEFT JOIN users
   ON users.id = user_id
  WHERE date < CURDATE()
  GROUP BY user_id;"
 )

然后在您的视图中:

代码语言:javascript
复制
@au.each do |u|
 <tr>
   <td>   u.first_name   </td>
   <td>   u.last_date    </td>
   <td>   u.last_status  </td>
 </tr>
end

请注意:这是在AssignmentUsers上迭代,所以如果有任何用户没有赋值,他们将被遗漏。如果这还不够好(例如,你不想拉回第二个列表-很容易通过User.all(:conditions => "id NOT IN (#{@au.collect(&:user_id}) -那么这个解决方案就不适合,如果是这样的话,我认为你可能已经用最好的方式做了,尽管我会把你的方法改成作用域--如果你想让我告诉你看起来会是什么样子,请告诉我。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/9314144

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档