Sql 通过命名的\u范围返回对象数组--has\u many…属于\u关联;联合所有查询
我正在寻找一个答案,它将通过(最好是)命名的_作用域或用户模型上执行一些操作的类方法返回一个用户对象数组 所以不用再多说了 我有两张桌子:用户和打架Sql 通过命名的\u范围返回对象数组--has\u many…属于\u关联;联合所有查询,sql,mysql,ruby-on-rails,named-scope,Sql,Mysql,Ruby On Rails,Named Scope,我正在寻找一个答案,它将通过(最好是)命名的_作用域或用户模型上执行一些操作的类方法返回一个用户对象数组 所以不用再多说了 我有两张桌子:用户和打架 用户有很多次打架(有很多次:打架,:外键=>'challenger\u id或challengee\u id') 战斗属于用户(属于:挑战者,:class\u name=>“用户”…属于:挑战者,:class\u name=>“用户”) Fight有以下几栏值得关注: 挑战者id(用户id fk) 挑战者id(用户id fk) challen
- 用户有很多次打架(有很多次:打架,:外键=>'challenger\u id或challengee\u id')
- 战斗属于用户(属于:挑战者,:class\u name=>“用户”…属于:挑战者,:class\u name=>“用户”)
- 挑战者id(用户id fk)
- 挑战者id(用户id fk)
- challenger_won(布尔值)
- 如果用户是挑战者且挑战者_won=true,则视为获胜
- 如果用户是挑战者且挑战者_won=false,则视为赢
- 如果挑战者_won=null,则忽略它
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;
因此,给定这些信息,我如何通过(最好是)命名的作用域或用户模型上执行某些操作的类方法返回用户对象数组?我认为您可以尝试类似的方法来重新创建查询结果:
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
但是,对于缓存PUSTS,您可能需要考虑向用户模型添加WiSnCurt字段。如果你为一场比赛的胜利者创建了一个二传方法,你可以在它改变的那一刻增加胜数。
或者,在没有加入的情况下(特定于mysql)啊,没错!真不敢相信,我没有想到只在用户模型中添加计数器…这绝对是最好的方法…感谢您将
打架
表中的challenger\u won
列更改为winner\u id
(user\u id fk),这将使查找赢家更加干净。然后你可以有一个has\u many:wins,:class\u name=>'Fight',:foreign\u key=>'winner\u id'
,这将允许你执行user.wins.count
来查找总的胜利
class User
named_scope :winners,
:select => 'if(challenger_won = FALSE,challenger,challengee) as winner,COUNT(id) AS wins ',
:group => 'user_id'
end