Mysql Rails活动记录中的Sql查询等价项
Rails noob在这里…我正在尝试在我的Rails项目中找到最好的选择。我有这样一个sql查询: 按countuser\u id>2的用户id从帐户组中选择countuser\u id为“count”的sumcountMysql Rails活动记录中的Sql查询等价项,mysql,sql,ruby-on-rails,ruby,activerecord,Mysql,Sql,Ruby On Rails,Ruby,Activerecord,Rails noob在这里…我正在尝试在我的Rails项目中找到最好的选择。我有这样一个sql查询: 按countuser\u id>2的用户id从帐户组中选择countuser\u id为“count”的sumcount 它所要做的就是获取拥有2个以上帐户的用户总数。虽然这个sql查询本身运行良好,但我正在尝试找到一种方法将其转换为活动记录。用户和帐户是我项目中的rails模型。我假设用户与帐户有很多关系?在这种情况下,您可以执行以下操作 User.find(id).accounts.cou
它所要做的就是获取拥有2个以上帐户的用户总数。虽然这个sql查询本身运行良好,但我正在尝试找到一种方法将其转换为活动记录。用户和帐户是我项目中的rails模型。我假设用户与帐户有很多关系?在这种情况下,您可以执行以下操作
User.find(id).accounts.count
count = 0
@users = User.all
@users.each do |user|
if user.accounts.count >= 2
count += 1
end
end
每次具有特定id的用户拥有>=2个帐户时,您可以在总数中添加1个帐户
或者你可以做类似的事情
User.find(id).accounts.count
count = 0
@users = User.all
@users.each do |user|
if user.accounts.count >= 2
count += 1
end
end
希望这是您一直在寻找的东西。蒂米的解决方案应该有效,但会导致。您可以使用.includes快速加载所需内容,以最小化对数据库的查询。我也假设您已经设置了您的has\u many,并且属于用户和帐户之间的关联。我相信这将是优化的实施:
users = User.includes(:accounts)
count = 0
users.each do |user|
count += 1 if user.accounts.count > 2
end
我相信你甚至可以通过链接一个.where来进一步重构它,但我不太确定如何重构。检查顶部链接到的文档页面
希望对您有所帮助。根据您提供的sql查询,Account model accounts表有一个名为user\u id的列,您正在使用该列进行分组。第一步是按用户id分组,并查找用户帐户计数。这将创建一个类似于{u1:n_acc1,u2:n_acc2}的散列。select语句选择所有键:值用户\u id:n\u帐户对,其中n\u帐户>2。然后,您只需要将n_值帐户映射到一个数组中,并对其应用求和
无需使用关联和/或即时加载。应该比其他解决方案更快。此外,发出一个db查询以查找分组计数,其余所有计算都将在ruby端进行。尽管此解决方案看起来不错,但它会为每个用户多次查询db。我只想得到总和,我给出的sql查询比rails的方式更便宜。