Ruby on rails 通过关系计数的轨道

Ruby on rails 通过关系计数的轨道,ruby-on-rails,activerecord,relationship,Ruby On Rails,Activerecord,Relationship,我的大脑在这方面有问题 我有四种模式:Account has many->List has many->ListItem您可以尝试以下方式: top_team_lead_categories = Category.all( :joins => {:list_item => {:list => :account}}, :select => "categories.*, sum(if(list_items.category_id = categories.id, 1,

我的大脑在这方面有问题


我有四种模式:Account has many->List has many->ListItem您可以尝试以下方式:

top_team_lead_categories = Category.all(
  :joins => {:list_item => {:list => :account}},
  :select => "categories.*, sum(if(list_items.category_id = categories.id, 1, 0)) as list_items_count",
  :conditions => ['accounts.role =?', 'team lead'],
  :group => 'categories.id',
  :order => 'list_items_count desc'
)
将此添加到您的帐户模型:

然后你可以这样做:

a = Account.first
a.list_items.joins(:category).group("categories.name").count
# => {"foo"=>1, "bar"=>2}
编辑

您必须将类别字段添加到select中,查询如下所示:

SELECT categories.name, accounts.role, count(list_items.id) 
FROM list_items INNER JOIN lists ON lists.id = list_items.list_id 
INNER JOIN categories ON categories.id = list_items.category_id 
INNER JOIN accounts ON lists.account_id = accounts.id 
GROUP BY categories.name, accounts.role;

如果我将第二行保留为:joins=>{:list\u item…,我发现名为“list\u item”的错误关联未找到;可能是您拼错了?。如果我将其更改为list\u items,我会在Postgres和SQLite中得到类似的错误:错误:函数ifboolean,integer,integer不存在。感谢您的回答-我认为这非常接近。该联接假设存在多对一关联在category和list_item之间,但是由于您的错误,我认为我的关联是错误的。第二个错误可能是因为我给了您一个MySQL函数。我认为Postgres版本的sum if是sumcase,当list_items.category_id=categories.id然后是1,否则是0 endRight,但是我必须检查有数千个帐户的所有帐户,并总结计算结果。我们的想法不是针对单个帐户,而是将前5名作为整个系统的整体想法。谢谢你的答案!好的,我明白你的意思。SQL查询对于很多记录来说都非常激烈。我编辑了我的答案-也许这会有所帮助。
a = Account.first
a.list_items.joins(:category).group("categories.name").count
# => {"foo"=>1, "bar"=>2}
@categories = Category.select("categories.name AS name, accounts.role AS role, count(list_items.id) AS count")
.joins(:list_items => {:list => :account})
.group("categories.name, accounts.role")
.order("count desc")
.limit(5)

@categories[0].role
# => Team Leader
@categories[0].count
# => 5
SELECT categories.name, accounts.role, count(list_items.id) 
FROM list_items INNER JOIN lists ON lists.id = list_items.list_id 
INNER JOIN categories ON categories.id = list_items.category_id 
INNER JOIN accounts ON lists.account_id = accounts.id 
GROUP BY categories.name, accounts.role;