【问题标题】:How to turn a self-table subquery SQL to a Rails named_scope?如何将自表子查询 SQL 转换为 Rails named_scope?
【发布时间】:2011-04-12 04:20:47
【问题描述】:

我正在使用 rails 2.3.10 和 named_scope 的新手。我正在处理一个 SQL,它检索特定事件的最后邀请列表。我想出了一个带有子查询的 SQL,它看起来可以做我想做的事。我在想是否可以使用named_scope 来做同样的事情,这样我就可以和find() 一起使用它。

我有以下问题:

  1. 可以用named_scope实现SQL吗?
  2. 能否以一种优雅的方式使子选择不包含在:condition?需要多个named_scope?
  3. named_scope(s) 的外观如何?
  4. find() 包含 name_scope(s) 时的外观如何?

SQL:

SELECT *
  FROM invitation inv1
  JOIN (
         SELECT event_id, user_id, MAX(invite_time) AS last_invite_time
           FROM invitation
          GROUP BY event_id, user_id
       ) AS last_invite ON
       inv1.event_id = last_invite.event_id AND
       inv1.user_id = last_invite.user_id AND
       inv1.invite_time = last_invite.last_invite_time

邀请数据:

event_id     user_id     invite_time       invite_reply_code
1            78          2011-02-01 15:21  1
2            78          2011-02-02 11:45  1
2            79          2011-02-02 11:50  1
2            79          2011-02-02 11:55  1
2            80          2011-02-02 11:50  1
2            80          2011-02-02 11:51  1

预期结果:

event_id     user_id     invite_time       invite_reply_code
2            78          2011-02-02 11:45  1
2            79          2011-02-02 11:55  1
2            80          2011-02-02 11:51  1

【问题讨论】:

    标签: ruby-on-rails activerecord subquery named-scope


    【解决方案1】:

    find 中的:joins 选项可以接受一个字符串,它只会粘在 SQL 中。要在其中获取您的 event_id,您需要使用 lambda,因此您需要的是这样的:

    named_scope :foo, lambda { |event_id|
      { :select => "oinv.*",
        :from => "invitation AS oinv"
        :joins => <<-SQL
          JOIN (
                 SELECT event_id, user_id, MAX(invite_time) AS last_invite_time
                   FROM invitation AS jinv
                  GROUP BY event_id, user_id
               ) AS last_invite ON
               oinv.event_id       = last_invite.event_id AND
               oinv.user_id        = last_invite.user_id AND
               oinv.invite_time    = last_invite.last_invite_time
          SQL
        , :conditions => [ "oinv.event_id = ?", event_id ]
      }
    }
    

    这完全未经测试,但希望你能看到我在做什么,这会让你走上正确的道路。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-28
      • 1970-01-01
      相关资源
      最近更新 更多