诗歌rails之 返回数组形式的id序列


Ruby代码
  1. Model.find(:all,:conditions=>["?",params]).collect{|mod|mod.id}  

可能没有考虑效率的问题。好吧,还是看看原文作者想说啥吧:

作者,首先想到的是:
Ruby代码
  1. Model.find(:all:select => 'id')  

但是,这样只能返回一个model实例和id的序列,如下:
Ruby代码
  1. >> User.find(:all,:select=>'id')  
  2. #=> [#<User id: 1>, #<User id: 2>, #<User id: 3>, #<User id: 4>, #<User id: 5>]  


然后,原文作者就想了,如果,需要的是值对的序列(array of values),那就用select_values吧,如下:
Ruby代码
  1. >> User.connection.select_values("select id from users")  
  2. #=> ["1", "2", "3", "4", "5"]  

喔,显然,这样是可以实现目地了。但是,文主,并不满意而且考虑如果在复杂查询的情况下,还希望能使用Rails的finder方法。

于是,文主说使用construct_finder_sql,这个东西我比较不熟悉
如下使用:
Ruby代码
  1. sql = Model.send(:construct_finder_sql:select => 'id':conditions => [...])  
  2. Model.connection.select_values(sql)  


试了试,还是挺好用的如下:
Ruby代码
  1. >> sql=User.send(:construct_finder_sql,:select=>'id',:conditions=>["id <= 4"])  
  2. #=> "SELECT id FROM `users`   WHERE (id <= 4) "  
  3. >> User.connection.select_value(sql)  
  4. #=> "1"  
  5. >> User.connection.select_values(sql)  
  6. #=> ["1", "2", "3", "4"]  


需要说明的是,construct_finder_sql是私有 方法,要使用send。select_value就返回一个。

然后,文主鼓吹,这样写的好处是
1. 使用更少的内存,因为没有创建model
2. 你也可以使用select_rows返回array of arrays
posted @ 2009-08-18 15:07  麦飞  阅读(803)  评论(0编辑  收藏  举报