Rails控制器动作中出现意外的sql操作顺序

时间:2014-02-11 04:24:09

标签: sql ruby-on-rails sqltransaction

我们有一项操作可返回每月简报的用户电子邮件动态列表。该操作采用可选的mark_as_sent参数,如果存在,将更新用户记录以显示他们今天已收到电子邮件。

但即使更新操作在之后选择了用户,但当mark_as_sent为真时,操作始终返回空列表。

这两个操作不是同一个交易的一部分,所以我不明白为什么第一个操作似乎在第二个之前生效?

  def monthly_email_list

    last_month = DateTime.current-1.month
    # Grab all users who havent received a monthly follow up email in a month or more:
    @users = User.where("monthly_email_sent < '#{last_month}' AND on_mailing_list = 't'").select("email","id") 

    if params[:mark_as_sent]
      count = User.where("monthly_email_sent < '#{last_month}'").select("email","id").update_all(:monthly_email_sent => DateTime.current)
    end

  end

1 个答案:

答案 0 :(得分:1)

Rails从第一个查询中延迟加载数据,并立即执行第二个查询。尝试强制第一个查询:

@users = User.where("monthly_email_sent < '#{last_month}' AND on_mailing_list = 't'").select("email","id").to_a