【问题标题】:How to get nil object when there is no record for a specific value in where clause in rails当rails的where子句中没有特定值的记录时如何获取nil对象
【发布时间】:2019-11-01 23:11:20
【问题描述】:

目前,我正在使用导轨中 Where 查询中的电话号码字段来获取用户记录,如下所示。

users = User.where(phone: ["123421341234", "123423144", "123423144","444633333",,,,,,,,,,,,])

我有前三个手机号码的用户记录。但是对于第 4 个手机号码(444633333),表中没有用户记录,所以对于这个用户,我想获取“nil”对象。(如果用户存在,则应返回用户对象)

如何更改上述查询。结果数组应包含序列中的对象(在搜索数组序列中)

【问题讨论】:

  • 你可以试试这样的[137,145,200].map { |id| User.find_by(phone: id) }。因为where 会忽略record not found exception
  • 但是查询越来越多。在单个查询中,我想获取所有记录。我的数据库包含数以亿计的用户。

标签: ruby-on-rails arrays where-clause


【解决方案1】:

我认为在不对数据库进行如此多查询的情况下执行此操作的唯一方法是先通过您已经拥有的 phone_number 加载所有用户,然后将您的 phone_numbers 映射到找到的用户

phones_numbers = [7799569, 7818111, 7820442, 78343033, 78347700, 7836863, 7837873, 7837898, 7838025, 7838442]
users = User.where(phone_number: phones_numbers)

users = phones_numbers.map { |number| users.find_by(phones_number: number) }

加载的用户将被缓存在内存中,因此即使有查询,它们的运行时间也将是微不足道的

如果您想在 ruby​​/rails 级别上执行此操作,也可以使用 #detect

#same stuff as above

users = phones_numbers.map { |number| users.detect { |user| user.phones_number == number } }

【讨论】:

    猜你喜欢
    • 2020-03-16
    • 2016-10-29
    • 1970-01-01
    • 2014-08-12
    • 1970-01-01
    • 2015-05-18
    • 1970-01-01
    • 2017-10-14
    • 1970-01-01
    相关资源
    最近更新 更多