2011-02-06 45 views
5

我正在尋找一個答案,將通過(最好)named_scope或通過用戶模型上的類方法返回一個用戶對象數組,該用戶模型進行一些操作。通過named_scope返回對象數組 - has_many ... belongs_to關聯; UNION ALL查詢

所以事不宜遲......

我有兩個表:用戶和打架。

  • 用戶有許多戰鬥(的has_many:戰鬥,:foreign_key => 'challenger_id或challengee_id')
  • 撲滅屬於用戶(belongs_to的:挑戰者,:CLASS_NAME => '用戶' ... belongs_to的:challengee ,:CLASS_NAME => '用戶')

撲滅具有關注的下列:

  • challenger_id(USER_ID FK)
  • CHALL engee_id(USER_ID FK)
  • challenger_won(布爾)

正如你所看到的,用戶可以是一個挑戰者或challengee,但不能同時使用。

  • 如果用戶是挑戰者並且challenger_won = true,那麼它被認爲是勝利。
  • 如果用戶是挑戰者而challenger_won = false,則認爲它是雙贏。
  • 如果challenger_won = null,那麼就忽略它。

我有一個返回由多數勝利分組戰鬥機屬性(user_ID的)原始SQL語句屬性:

SELECT a.fighter, COUNT(*) AS wins 
    FROM (SELECT challenger_id AS fighter 
      FROM fights 
     WHERE challenger_won = TRUE 
     UNION ALL 
     SELECT challengee_id AS fighter 
      FROM fights 
     WHERE challenger_won = FALSE 
     ) AS a 
GROUP BY a.fighter; 

所以給出這樣的信息,如何通過返回用戶對象的數組(最好)一個named_scope或通過用戶模型上的類方法進行一些操作?

+0

考慮在`fights`表改變`challenger_won`列,到`winner_id`(USER_ID FK),這將使發現贏得了很多清潔。然後,你可以有一個'has_many:wins,:class_name =>'Fight',:foreign_key =>'winner_id',這將允許你做`user.wins.count`找到總勝數 – joshnuss 2011-02-12 23:19:59

回答

4

我想你可以嘗試這樣的事情來重建結果您查詢:

class User 
    named_scope :winners, 
     :select => 'users.*, COUNT(fight.id) AS wins', 
     :join => :fights, 
     :conditions => ['(fights.challenger_id = user_id AND fights.challenger_won = TRUE) OR (fights.challengee_id = user_id AND NOT fights.challenger_won = FALSE)'] 
     :group => 'user_id' 
end 

然而,對於緩存puposes,你可能要考慮增加一個win_count領域的用戶模型。如果您爲戰鬥勝利者創建了一個setter方法,那麼當它改變時,您可以增加win_count的權利。

+0

ahh,沒錯!不能相信我沒有想到僅僅爲用戶模型添加反作用力......這絕對是最好的方法......謝謝 – keruilin 2011-02-10 21:20:19

0

或者沒有連接(MySQL的具體)

class User 
    named_scope :winners, 
    :select => 'if(challenger_won = FALSE,challenger,challengee) as winner,COUNT(id) AS wins ', 
    :group => 'user_id' 
end