我正在寻找一个答案,它将通过(最好)一个named_scope返回一个用户对象数组,或者通过User模型上的类方法返回一些操作.
所以没有进一步的…
>用户有很多打架(has_many:打架,:foreign_key =>’challenger_id或challengee_id’)
>战斗属于用户(belongs_to:challenger,:class_name =>’用户’… belongs_to:challengee,:class_name =>’用户’)
战斗有以下几个关注的栏目:
> challenger_id(user_id fk)
> challengee_id(user_id fk)
> challenger_won(布尔值)
如您所见,用户可以是挑战者或挑战者,但不是两者.
>如果用户是挑战者并且challenger_won = true,那么它被视为胜利.
>如果用户是挑战者且challenger_won = false,则认为是胜利.
>如果challenger_won = null,那么就忽略它.
我有一个原始的sql语句,它返回按最多wins属性分组的战斗机属性(user_id):
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返回一个用户对象数组,或者通过用户模型上的类方法进行一些操作?
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
但是,对于缓存目的,您可能需要考虑将win_count字段添加到User模型.如果为战斗的胜利者创建一个setter方法,则可以在更改时立即增加win_count.
原文地址:https://www.jb51.cc/mysql/432993.html
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。