【问题标题】:What is the fastest way to make an array from a db column?从 db 列创建数组的最快方法是什么?
【发布时间】:2015-11-26 18:38:36
【问题描述】:

我需要将 ActiveRecord 模型的数据库列的所有元素放入一个数组中。我是这样做的:

code_array = []
Language.all.each do |lang|
  code_array<<lang.code
end

=> ["af", "sq", "ar", "hy", "az", "eu", "be", "bn", "bs", "bg", "ca", "ceb", "ny", "zh-CN", "zh-TW", "hr", "cs", "da", "nl", "en", "eo", "et", "tl", "fi", "fr", "gl", "ka", "de", "el", "gu", "ht", "ha", "iw", "hi", "hmn", "hu", "is", "ig", "id", "ga", "it", "ja", "jw", "kn", "kk", "km", "ko", "lo", "la", "lv", "lt", "mk", "mg", "ms", "ml", "mt", "mi", "mr", "mn", "my", "ne", "no", "fa", "pl", "pt", "ma", "ro", "ru", "sr", "st", "si", "sk", "sl", "so", "es", "su", "sw", "sv", "tg", "ta", "te", "th", "tr", "uk", "ur", "uz", "vi", "cy", "yi", "yo", "zu"]

但这必须通过更优雅和/或更少的代码来实现?

【问题讨论】:

    标签: arrays ruby ruby-on-rails-4


    【解决方案1】:

    你要找的方法是pluck

    Language.pluck(:code)
    

    顺便说一句,即使你不使用 pluck,你也可以通过改变来显着改进你的代码:

    code_array = []
    Language.all.each do |lang|
      code_array<<lang.code
    end
    

    Language.all.map(&:code)
    

    您的代码正在遍历所有结果,获取字段 code 并将其推送到数组中,然后移动到下一个元素。将函数映射到集合或数组通常更有效。

    【讨论】:

    • 您提出的改进纯粹是为了美观。底层操作还是一样的。意思是,它不是“更有效率”。
    • 完美答案!我从未听说过 pluck 方法,这正是我在写这个问题时所寻找的。不过我本可以想到地图。不知何故,map 很难进入我活跃的 ehh 曲目。
    • @SergioTulentsev:有更有效的方法吗?如果没有,我对这种美学改进感到非常满意。
    • @Flip:是的,它肯定比你的代码更好。我只是指出了一个错误的说法。
    • @Flip:pluck 绝对是要走的路。如果Language 有很多其他列,您可以只选择需要的列。比如:Language.select('code').map(&amp;:code).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-08
    • 1970-01-01
    • 2011-10-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多