【问题标题】:i need to get a user id from a query result我需要从查询结果中获取用户 ID
【发布时间】:2019-06-13 16:53:35
【问题描述】:

我正在使用用户名从我的用户表中查询,我如何从查询对象中获取用户 ID User.where(user_name: "john")

我的目标是获取 User id: 5,我认为它就像 (.id) 一样简单,但那不起作用

=> #<ActiveRecord::Relation [#<User id: 5, user_name: "john", user_city: "India", created_at: "2019-01-19 18:02:32", updated_at: "2019-01-19 18:02:32">]> 

【问题讨论】:

  • 我认为它就像 (.id) 一样简单,但那行不通。您到底尝试了什么,错误是什么? 单条记录上的.id 应该可以正常工作。请注意,.where 将返回记录的集合,因此该集合将无法识别.id。如果只有一个,你可以这样做,User.where(user_name: 'john').first.id。

标签: ruby database ruby-on-rails-3 relational-database


【解决方案1】:

物化where 将返回一个集合,因此您可以使用.first 获得第一条记录

User.where(:user_name => "john").first&.id

或者使用find_by,它将返回满足条件的第一条记录。

User.find_by(:user_name => "john")&.id

【讨论】:

  • @lurker, object&amp;.attribute 是安全导航操作员。通过在对象上使用它,如果对象是nil,则不会引发异常,而是将nil值作为返回值传播。
  • 是的,很抱歉,我之前没见过这个符号。谢谢!
【解决方案2】:

如果您真的只是想获取 id(即,不使用对象的任何其他属性),通常最好将其表述为 .pluck。这需要less time for ActiveRecord 进行实例化,并使查询作业更好地利用您的数据库索引。只要User#user_name 是唯一的(我希望如此!)它就会返回一个长度为 1 的数组。

User.where(user_name: "John").first.&id 
   # SELECT "users".* FROM "users" WHERE "users"."user_name" = "John" 
   # ORDER BY "users" ASC LIMIT 1
   # => 1 or nil

User.where(user_name: "John").pluck(:id).first
   # SELECT "users"."id" FROM "users" WHERE "users"."user_name" = "John"
   # => 1 or nil

不幸的是,find_by 及其助手不能以这种方式与 pluck 一起工作,而且这两个语句都会导致错误

User.find_by(user_name: "John").pluck(:id)
User.find_by_user_name("John").pluck(:id)

【讨论】:

    猜你喜欢
    • 2019-10-05
    • 1970-01-01
    • 2020-07-01
    • 2018-07-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多