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

yangman_wenzhu · 发布于 2014年4月22日 · 最后由 xlaok 回复于 2014年4月22日 · 1304 次阅读
1714

如题,要用到sql中的:

a =  "1,2,3,4" 变为 (1,2,3,4)
select * from tables where id in a
共收到 17 条回复
2898
xlaok · #1 · 2014年4月22日

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

2564
kikyous · #2 · 2014年4月22日

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

4938
dy1901 · #3 · 2014年4月22日

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

1714
yangman_wenzhu · #4 · 2014年4月22日

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

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

多谢各位

2474
kabie · #5 · 2014年4月22日

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

1714
yangman_wenzhu · #6 · 2014年4月22日

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

2474
kabie · #7 · 2014年4月22日

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

1714
yangman_wenzhu · #8 · 2014年4月22日

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

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

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

2474
kabie · #10 · 2014年4月22日

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

1714
yangman_wenzhu · #11 · 2014年4月22日

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

4375
saiga · #12 · 2014年4月22日 3 个赞

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

ModelB.find ModelA.pluck(:id)
250
miclle · #13 · 2014年4月22日

#12楼 @saiga :plus1:

250
miclle · #14 · 2014年4月22日 1 个赞

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"]
1714
yangman_wenzhu · #15 · 2014年4月22日

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

250
miclle · #16 · 2014年4月22日

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

2898
xlaok · #17 · 2014年4月22日

#12楼 @saiga 赞态度

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