2014-11-04 42 views
0

我一直在閱讀關於Rails活動記錄模型操作的教程。我對.select和.group之間的區別有點困惑。如果我想獲得我的所有用戶的所有名稱表的用戶,我相信我能做到:Rails活動記錄的select和group有什麼區別?

myUsers = User.select(:name) 

所以怎麼會是這樣不同,他說:

myUsers = User.group(:name) 

感謝,

回答

2

兩個不同的是這樣的:

User.select(:name) 

相當於這個SQL語句

SELECT name from users; 

User.group(:name) 

相當於

SELECT * from users GROUP BY name; 

所不同的是,使用select(:name)您將按id排序的所有行排序,但僅與列name排序。用group(:name)您正在取所有列的所有列,但按列name排序。

User.pluck(:name)將是從你的數據庫中拉出所有名字的最快方法。

+0

啊,好的。感謝您的澄清! – Will 2014-11-04 03:09:35

1

#to_sql方法檢查什麼DB查詢它正在建設。通過查看數據庫查詢,您可以確認自己發生了什麼。請看下面的例子: -

[email protected]:~/Rails/tv_sms_voting> rails c 
Loading development environment (Rails 4.1.4) 
>> Vote.group(:choice).to_sql 
=> "SELECT \"votes\".* FROM \"votes\" GROUP BY choice" 
>> Vote.select(:choice).to_sql 
=> "SELECT \"votes\".\"choice\" FROM \"votes\"" 
>> 

現在很明顯,Vote.select(:choice)其實,SELECT "votes"."choice" FROM "votes",這意味着,從表votes的所有行選擇choice列。

Vote.group(:choice)votes表的行分組,基於列choice並選擇所有列。

如果我想獲取表User中所有用戶的所有名稱。

更好的是User.pluck(:name)

+0

好的。那麼這與Vote.all.order(:choice)之類的東西有什麼不同? – Will 2014-11-04 03:11:50

+1

這樣做會爲您提供所有按「選擇」列排序的記錄(所有列),而不僅僅是按表ID排序的「名稱」列。 – nikkon226 2014-11-04 03:13:20