You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使inject([])在.where()无结果时返回空数组?附现有代码

让我来一步步帮你解决这两个问题:

问题1:当集合为nil时,collection.inject([]){...}能否返回空数组[]?

首先要明确两个核心场景:

  • 如果collection本身是nil:直接调用inject会触发NoMethodError,因为nil对象根本没有inject方法,更别说返回空数组了。
  • 如果是空集合(比如ActiveRecord的.where查询无结果时返回的ActiveRecord::Relation空实例):调用inject([])会直接返回你传入的初始值[]——因为没有元素可以遍历,块代码根本不会执行,直接返回初始的空数组。

举个直观的例子:

# 场景1:空集合(ActiveQuery无结果)
empty_jobs = Job.none # 模拟.where无结果的情况
empty_jobs.inject([]) { |memo, job| memo << job } # 返回 []

# 场景2:nil集合
nil_jobs = nil
nil_jobs.inject([]) { ... } # 抛出 NoMethodError: undefined method `inject' for nil:NilClass
问题2:用inject([])实现现有方法的效果,保证无结果时返回空数组

你的现有方法通过each循环收集符合条件的job,用inject改写其实很直接,而且完全能保证无结果时返回空数组——因为ActiveRecord的.where即使没查到数据,返回的也是空的关系对象(不是nil),调用inject([])时会直接返回初始的空数组。

改写后的代码如下:

def jobs_it_can_be_contacted_for
  user_jobs.where("user_jobs.user_job_type IN (?)", ['job', 'represent']).inject([]) do |memo, user_job|
    # 只添加非unknown的job到memo中
    memo << user_job.job unless user_job.job == Job.unknown
    # 必须返回memo!这是inject的核心,否则条件不满足时会返回nil破坏结果
    memo
  end
end

额外优化建议

你还可以把查询条件改成ActiveRecord更推荐的哈希写法,既简洁又能避免SQL注入风险:

def jobs_it_can_be_contacted_for
  user_jobs.where(user_job_type: ['job', 'represent']).inject([]) do |memo, user_job|
    memo << user_job.job unless user_job.job == Job.unknown
    memo
  end
end

这里的关键细节是必须在块的末尾返回memo:如果省略这一步,当遇到Job.unknown时,块会返回nil(因为unless分支不执行,没有返回值),后续迭代的memo就会变成nil,最终结果就会出错。

内容的提问来源于stack exchange,提问作者romss182

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.15 06:51:15