Ruby 把字符串"1,2,3,4" 变为 (1,2,3,4)

yangman_wenzhu · 2014年04月22日 · 最后由 xlaok 回复于 2014年04月22日 · 2581 次阅读

如题,要用到 sql 中的:

a =  "1,2,3,4" 变为 (1,2,3,4)
select * from tables where id in a

哈哈,我也遇到过这个需求,当时没想出什么比较好的办法,写出来的代码自己看起来都恶心~

"1,2,3,4".split(",")

是想变为 array 吧,a.split(",") 就可以了

#3 楼 @dy1901 #2 楼 @kikyous #1 楼 @xlaok 解决了:

a = A.collect(&:id) #=>[1,2,3,4]
select * from tables where id in a

多谢各位

看起来你这个不能算是真的解决了……这是 ActiveRecord?

#5 楼 @Kabie 什么意思呢?这样的写法会出什么问题呢?还请指教哦!

#6 楼 @yangman_wenzhu 关键你的 "1,2,3,4" 是怎么来的……而你又要怎么使用 (1,2,3,4) 看你 4 楼的解决方法并不存在 "1,2,3,4",说明你最开始的根本问题很可能就不是把字符串 "1,2,3,4" 变为 (1,2,3,4),所以你很可能用不太合理的方式解决了一个本来并不存在的问题……

#7 楼 @Kabie 哦 明白你的意思了,我是断章了,没把代码贴完全,a 也是从数据库里一张表取出的 id 集合一开始的写法是

a = A.collect(&:id).join(',') #=> '1,2,3,4'
select * from tables where id in a
再用这句只能查找出tables.id=1的数据其他都无法查找出来了

ModelB.where(:id => ModelA.select(:id).collect(&:id))

#8 楼 @yangman_wenzhu 那么为什么 a 是用 ORM 而后面的一句手工拼 sql 呢?

#9 楼 @miclle 正解,哈哈,后来自己也搞出来了,不过还是谢谢你了!

不要瞎试,否则这个大概正确的答案会伴随你几个月甚至几年。 你应该把 http://guides.rubyonrails.org/active_record_querying.html 看完,不要嫌长,否则谁也救不了你了.....

ModelB.find ModelA.pluck(:id)

Unlike select, pluck directly converts a database result into a Ruby Array, without constructing ActiveRecord objects. This can mean better performance for a large or often-running query. However, any model method overrides will not be available. For example:

class Client < ActiveRecord::Base
  def name
    "I am #{super}"
  end
end

Client.select(:name).map &:name
# => ["I am David", "I am Jeremy", "I am Jose"]

Client.pluck(:name)
# => ["David", "Jeremy", "Jose"]

#14 楼 @miclle 刚才也看到这里了,虽然不是很理解,但是好想性能比我写的要好很多,不过我的程序里使用 collect 就足够了,谢谢!

你还是用 #12 楼的方法吧,那样确实好很多。select 和 pluck 花在 DB 上的时间一样,但 select 会在内存中构建 ActiveRecord 对象,而 pluck 是直接返回数组

需要 登录 后方可回复, 如果你还没有账号请 注册新账号