【问题标题】:Rails Console find users by array of idsRails 控制台通过 id 数组查找用户
【发布时间】:2014-02-21 12:47:05
【问题描述】:

所以我有一个用户 ID 数组。 Rails 控制台中是否有办法使用数组查询所有这些用户

类似

ids = [1, 2, 3, 4]

users = User.find(ids)

让它返回所有 4 个用户?

【问题讨论】:

  • 它确实有效。您可以将一组 ID 传递给模型的 find 方法,如果它们都是现有的 ID,您将获得这些 ID 的用户数组。
  • 没有意识到这行得通...哈哈。应该已经测试过了。

标签: mysql ruby-on-rails ruby postgresql rails-console


【解决方案1】:

对于数组,您可以使用以下之一:

# Will raise exception if any value not found
User.find( [1,3,5] )

# Will not raise an exception
User.find_all_by_id( [1,3,5] ) # Rails 3
User.where(id: [1,3,5])        # Rails 4

如果你碰巧使用了一个范围,你可以使用这些:

# Will raise exception if any value not found
User.find((1..4).to_a)   #same as User.find([1,2,3,4])

# Will not raise an exception
User.find_all_by_id(1..4)  # Rails 3
User.where(id: 1..4)       # Rails 4

正如@diego.greyrobot 在评论中指出的那样,范围会导致 SQL BETWEEN 子句,而数组会导致 SQL IN 子句。

不要使用User.find_by_id()——不管你传入多少ID,它只会返回一条记录。

【讨论】:

  • 我的实际数组不是从 1 到 4。ID 是零星的,例如 122、323、451。我还能实现吗?
  • 这里有一些不准确之处:User.find((1..4).to_a) 会使其工作。并且:1..4 创建一个范围而不是一个数组。
  • 是的,需要注意的是传入一个范围 (User.find_all_by_id(1..4)) 将执行一个 sql BETWEEN 子句,而传入一个数组将执行一个 sql IN 语句。
  • 编辑添加 Rails 4 首选版本。
  • .find 返回Array。而 .where 返回 ActiveRecord::Relation
【解决方案2】:

你可以使用User.where(id: ids)

【讨论】:

  • 在 Rails 4 中,find_all_by_id 已弃用,因此请使用 where
  • 在rails 5中,它似乎根本不起作用,所以一定要使用User.where(id: [1,2,3,4])
【解决方案3】:

使用飞溅操作符:

ids = [1, 2, 3, 4]

users = User.find(*ids)

请注意,如果找不到任何用户,它将引发异常。

【讨论】:

  • 哦,这很好。我不知道那个。
  • 你不需要喷它,find 需要一个数组就好了。
  • 我也发现了。 splat 什么都不做。
【解决方案4】:

这对我有用...

ids = [1, 2, 3, 4]

users = User.find(ids)

users = User.find(*ids)

users = User.find_all_by_id(ids)

一切正常..

【讨论】:

    【解决方案5】:

    你可以使用

       Users.where({ id: [1,2,3 ,4]})
     # SELECT * FROM users WHERE id IN (1,2,3,4)
    

    【讨论】:

    • 我鼓励您扩展此答案以提供一些解释。一个全是代码的答案并不能真正为不熟悉问题中概念的其他用户提供很多信息。
    【解决方案6】:

    当所有 id 都存在时,你正在做的事情应该可以工作。

    您可能会看到异常的原因是因为这些 id 中至少有一个在数据库中不存在。

    相反,如果您不想获得异常,您想使用find_all_by_id

    User.find_all_by_id([1, 2, 3, 4])
    
    # Does the following sql:    
    User Load (0.4ms)  SELECT `users`.* FROM `users` WHERE `users`.`id` IN (1, 2, 3, 4)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2022-08-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-03-19
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多