我需要返回一个记录数组(来自表Foo),它们被引用为另一个数据库表的两列中的任何一列中的外键的次数:
id | old_foo_id | new_foo_id
-------------------------------
1 | 1 | 1
2 | 2 | 2
3 | 3 | 3
4 | 1 | 1
5 | 1 | 2
6 | 2 | 4
7 | 4 | 2
8 | 5 | 5
9 | 6 | 6
10 | 7 | 7
例如,使用上面的数据,我需要一个ActiveRecord(或直接SQL)查询来返回由大多数常见外键排序的哈希(如果同时出现在old_foo_id
和{{new_foo_id
中,则每个记录只计算一次1}})像这样:
{"2"=>4, "1"=>3, "4"=>2, "3"=>1, "5"=>1, "6"=>1, "7"=>1}
除了遍历每个Foo对象并进行大量查询之外,我不知道如何做到这一点 - 看起来非常低效且耗时。 非常感谢提前!
我在这里发现了类似的问题: Get count of foreign key from multiple tables
答案 0 :(得分:0)
对以前的回答感到抱歉:我会在app / models / foo.rb中创建一个对象:
为该模型创建一个可以返回这样一个哈希的方法:
def self.frequency_count
...
所以例如你想: {" 2" => 4," 1" => 3," 4" => 2," 3" => ; 1," 5" => 1," 6" => 1," 7" => 1}
所以我会这样做
foo has_many :bars
def self.counts
self.bars.count
end
在app/controllers/foo
def freq_counter
@foos = Foo.all
myHash = {}
@foos.each do |foo|
myHash[foo.id]= foo.counts
end
myHash
end
所以至少现在我们缩小了您希望在最优化的SQL命令中执行上述操作。
答案 1 :(得分:0)
经过大量的反复试验,这个SQL查询效果很好:
a = ActiveRecord::Base.connection.execute("SELECT foos.old_foo_id, count(*) FROM foos GROUP BY old_foo_id ORDER BY count DESC")
puts a.to_a