Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 通过命名的\u范围返回对象数组--has\u many…属于\u关联;联合所有查询_Sql_Mysql_Ruby On Rails_Named Scope - Fatal编程技术网

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=>“用户”)
Fight有以下几栏值得关注:

  • 挑战者id(用户id fk)
  • 挑战者id(用户id fk)
  • challenger_won(布尔值)
正如您所看到的,用户可以是挑战者或被挑战者,但不能同时是挑战者和被挑战者

  • 如果用户是挑战者且挑战者_won=true,则视为获胜
  • 如果用户是挑战者且挑战者_won=false,则视为赢
  • 如果挑战者_won=null,则忽略它
我有一个原始SQL语句,它返回按most wins属性分组的fighter属性(用户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;

因此,给定这些信息,我如何通过(最好是)命名的作用域或用户模型上执行某些操作的类方法返回用户对象数组?

我认为您可以尝试类似的方法来重新创建查询结果:

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