2011-04-12 39 views
1

我正在使用rails 2.3.10和新的named_scope。我正在處理一個SQL,它會檢索特定事件的最後一個邀請列表。我想出了一個帶子查詢的SQL,看起來它可以做我想做的事。我在考慮是否可以使用named_scope來做同樣的事情,以便我可以使用find()如何將自我表子查詢SQL轉換爲Rails的named_scope?

我有以下問題:

  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 

回答

0

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 ] 
    } 
} 

這是完全未經測試,但希望你能看到我在做什麼,這套你在正確的道路上。