诗歌rails之 返回数组形式的id序列
- Model.find(:all,:conditions=>["?",params]).collect{|mod|mod.id}
可能没有考虑效率的问题。好吧,还是看看原文作者想说啥吧:
作者,首先想到的是:
- Model.find(:all, :select => 'id')
但是,这样只能返回一个model实例和id的序列,如下:
- >> User.find(:all,:select=>'id')
- #=> [#<User id: 1>, #<User id: 2>, #<User id: 3>, #<User id: 4>, #<User id: 5>]
然后,原文作者就想了,如果,需要的是值对的序列(array of values),那就用select_values吧,如下:
- >> User.connection.select_values("select id from users")
- #=> ["1", "2", "3", "4", "5"]
喔,显然,这样是可以实现目地了。但是,文主,并不满意而且考虑如果在复杂查询的情况下,还希望能使用Rails的finder方法。
于是,文主说使用construct_finder_sql,这个东西我比较不熟悉
如下使用:
- sql = Model.send(:construct_finder_sql, :select => 'id', :conditions => [...])
- Model.connection.select_values(sql)
试了试,还是挺好用的如下:
- >> sql=User.send(:construct_finder_sql,:select=>'id',:conditions=>["id <= 4"])
- #=> "SELECT id FROM `users` WHERE (id <= 4) "
- >> User.connection.select_value(sql)
- #=> "1"
- >> User.connection.select_values(sql)
- #=> ["1", "2", "3", "4"]
需要说明的是,construct_finder_sql是私有 方法,要使用send。select_value就返回一个。
然后,文主鼓吹,这样写的好处是
1. 使用更少的内存,因为没有创建model
2. 你也可以使用select_rows返回array of arrays
莫愁前路无知己,天下无人不识君。