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

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

如题,要用到sql中的:

a =  "1,2,3,4" 变为 (1,2,3,4)
select * from tables where id in a
共收到 17 条回复
2898

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

2564

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

4938

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

1714

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

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

多谢各位

2474

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

1714

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

2474

#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

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

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

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

2474

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

1714

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

4375

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

ModelB.find ModelA.pluck(:id)
250

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

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

250

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

2898

#12楼 @saiga 赞态度

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