如何将自表子查询SQL转换为Rails named_scope?

我正在使用rails 2.3.10和新的
named_scope
。我正在处理一个SQL,它检索特定事件的最后一个邀请列表。我想出了一个带有子查询的SQL,看起来它可以做我想要的。我在考虑是否可以使用
named_scope
做同样的事情,这样我就可以用
find()
来使用它。 我有以下问题: 是否可以用
named_scope
实现SQL? 是否可以以优雅的方式使子选择不包含在
:condition
?需要多个named_scope?
named_scope
(s)怎么样? 当includes2ѭ包含name_scope时,它是如何形状的? 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
    
已邀请:
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 ]
  }
}
这是完全未经测试的,但希望你能看到我正在做的事情,这会让你走上正确的道路。     

要回复问题请先登录注册