我正在Rails站點上使用ruby,我想檢查其數據庫中哪些是註冊用戶中最常用的名稱。哪個是最常用的名字?
有一行名爲「名字」,我會經歷。我現在不介意區分大小寫。
任何方便的方法來檢查什麼是最流行的名稱,然後是第二最受歡迎的,第三受歡迎的等等?
我想到的是讓所有用戶都在一個數組中,然後執行@ users.each do | user |,然後在數組中記錄名稱,然後計算每個記錄具有多個記錄的重複項元素記錄。我不確定它是否正確。
我正在Rails站點上使用ruby,我想檢查其數據庫中哪些是註冊用戶中最常用的名稱。哪個是最常用的名字?
有一行名爲「名字」,我會經歷。我現在不介意區分大小寫。
任何方便的方法來檢查什麼是最流行的名稱,然後是第二最受歡迎的,第三受歡迎的等等?
我想到的是讓所有用戶都在一個數組中,然後執行@ users.each do | user |,然後在數組中記錄名稱,然後計算每個記錄具有多個記錄的重複項元素記錄。我不確定它是否正確。
這裏是如何使用ActiveRecord
做到這一點:
User.group(:first_name).order('popularity desc').pluck(:first_name, 'count(*) as popularity')
此代碼轉換到SQL:
SELECT "users.first_name", count(*) as popularity FROM "users"
GROUP BY first_name
ORDER BY popularity
和你喜歡的東西:
[["John", 2345], ["James", 1986], ["Sam", 1835], ...]
如果您只需要前十位名稱,只需添加即可限制結果數量3210:
User.group(:first_name).order('popularity desc').limit(10).pluck(:first_name, 'count(*) as popularity')
另一種選擇是使用count
API:
User.group(:first_name).count
=> {"Sam" => 1835, "Stefanos" => 2, ...}
# ordered
User.group(:first_name).order('count_all desc').count
=> {"John" => 2345, "James" => 1986, "Sam" => 1835, ...}
# top 3
User.group(:first_name).order('count_all desc').limit(3).count
=> {"John" => 2345, "James" => 1986, "Sam" => 1835 }
你可以做下面的SQL語句
select count(*) as count from users group by users.first_name order by count desc
將返回最頂部的結果。正如鮑里斯所說,只使用sql是去這裏的正確途徑。
否則,如果你想加載所有的用戶,你可以通過map-reduce來實現。
@users.group_by(&:first_name).sort(&:count).reverse
會給你一個按用戶名降序排列的用戶數組。
使用ActiveRecord
另一種方式:
User.group(:first_name).count
生成的SQL是:
SELECT COUNT(*) AS count_all, name AS name FROM `users` GROUP BY name
將輸出{名稱=> number_of_occurances}的散列e.g
{"John" => 29, "Peter" => 87, "Sarah" => 2}
我得到'NameError:undefined local variable or method' first_name'' – 2014-11-03 09:24:15
在rails 4.1上測試過ruby 2.0!應該在以前的版本上工作我猜 – Nimir 2014-11-03 09:34:28
不應該是'User.group(:first_name).count'? – 2014-11-03 09:37:10
更好在SQL從而不放過所有spurios選擇並在代碼檢查準備的查詢。 – 2014-11-03 08:23:43
如果你有一個包含所有First Names的數組,你可以簡單地使用一個散列來計算它。 例如 'fnames = [「Apple」,「Ben」,Ben「,」John「]' 'counts = Hash.new(0)' 'fnames。每個{|名稱|計數[name] + = 1}' 將輸出 #=> {「Apple」=> 1,「Ben」=> 2,「John」=> 1} – Benji 2014-11-03 08:37:58