x無法存取,你可能沒有權限或未登入。
19e786a2a74377ff6e052d87fd8d1fa8

Rails 3.2 ,ActiveRecord 實作 Pluck (採摘)

2011-12-05 23:52:07 +0800xditeRuby on Rails 節點 中發起
最後由 hooopo2011-12-09 16:16:18 +0800回應 , 573次閱讀

以往透過 ActiveRecord 拉資料,都是 SELECT *。Rails 3.2 新增機制 Pluck,可以只「摘」出特定欄位了!

請看 commit : http://github.com/rails/rails/commit/a382d60f6abc94b6a965525872f858e48abc00de

截至 2011-12-09 16:16:18 +0800,共收到 13 條回應
36b1f565fc83d9b67588123f2171b896
chitsaou 1樓, 於2011-12-06 00:15:50 +0800回應

剛剛在想這跟 select(:field) 有何不同,所以實際操作了一下。

ree-1.8.7-2011.03 :009 > Post.select("id")
  Post Load (0.2ms)  SELECT id FROM "posts" 
 => [#<Post id: 19>, #<Post id: 20>, #<Post id: 21>, #<Post id: 22>, #<Post id: 23>, #<Post id: 24>, #<Post id: 25>, #<Post id: 27>, #<Post id: 29>, #<Post id: 30>, #<Post id: 31>, #<Post id: 32>] 

拿到的東西是 Post 的 instances ,每個 instance 只有設定 id 這個 instance variable 而已。

如果要拿 id array 的話,得要 .map(&:id)

ree-1.8.7-2011.03 :013 > Post.select("id").map(&:id)
  Post Load (0.2ms)  SELECT id FROM "posts" 
 => [19, 20, 21, 22, 23, 24, 25, 27, 29, 30, 31, 32] 

而這條 commit 的 pluck(:id) 就是幫你變成一條 array of value of field(s) 。

Ff7afae5b23125e25e18ad8c0404bd78
hechian 2樓, 於2011-12-06 00:46:15 +0800回應

所以也就是說,摘出來的直接就是資料,而非Object囉?

C814acfd2c0897d2fc20de6800b76293
hSATAC 3樓, 於2011-12-06 13:20:46 +0800回應

@chitsaou 給你一個讚

E9ed4664dfd7ea664ccc5813de4d1fd7
hooopo 4樓, 於2011-12-06 21:53:27 +0800回應

#2楼 @hechian 是的

ruby-1.9.2-p180 :008 > User.pluck(:name)
   (0.3ms)  SELECT name FROM "users" 
 => ["ss", "ss"] 
ruby-1.9.2-p180 :009 > User.pluck(:id)
   (0.2ms)  SELECT id FROM "users" 
 => [1, 2] 
ruby-1.9.2-p180 :010 > 

Ff7afae5b23125e25e18ad8c0404bd78
hechian 5樓, 於2011-12-07 11:48:51 +0800回應

#4楼 @hooopo 這樣看來蠻好用的,也不必再自己多轉一次了 ...
那跟自己跑比起來,哪個會快?

C814acfd2c0897d2fc20de6800b76293
hSATAC 6樓, 於2011-12-07 13:22:58 +0800回應

應該一樣快吧,只是寫起來比較短比較好看。

E9ed4664dfd7ea664ccc5813de4d1fd7
hooopo 7樓, 於2011-12-07 15:26:59 +0800回應

#6楼 @hSATAC 同意,就是方便。自动加select选项和自动map出value

Dafd47e89ea66e9ca5c001afebd17576
hlb 8樓, 於2011-12-09 13:25:56 +0800回應

看成 ActiveRecord 實作 Plurk...

2700fbe9e51dde6e61ee553b60c31153
wildjcrt 9樓, 於2011-12-09 15:19:00 +0800回應

#8楼 @hlb XDDDDD Pluck 一不小心就會變成 Plurk

19e786a2a74377ff6e052d87fd8d1fa8
xdite 10樓, 於2011-12-09 15:21:52 +0800回應

我在打這篇時,就差一點打錯...

E9ed4664dfd7ea664ccc5813de4d1fd7
hooopo 11樓, 於2011-12-09 15:45:51 +0800回應

#10楼 @xdite 通过邮件点击过来链接有错误 链接到了:http://topics/58

19e786a2a74377ff6e052d87fd8d1fa8
xdite 12樓, 於2011-12-09 16:01:38 +0800回應

可以幫我發個 issue 上 github 嗎?thanks

E9ed4664dfd7ea664ccc5813de4d1fd7
hooopo 13樓, 於2011-12-09 16:16:18 +0800回應

#12楼 @xdite 发了 ...

需要 登入 後方可回應,如果你還沒有帳號按這裡 註冊