ruby-on-rails 如何从Rails活动记录查询中提取“as alias_name”

balp4ylt  于 2023-05-02  发布在  Ruby
关注(0)|答案(3)|浏览(127)

我有这个疑问:

Client.select("name as dname")

它运行良好。

Client.select("name as dname").first.dname
=> "Google"

现在我想得到所有的dname作为一个数组,但pluck方法不工作,因为dname不是列名。

2.2.5 :040 > Client.select("name as dname").pluck(:dname)
   (0.6ms)  SELECT dname FROM "clients"
ActiveRecord::StatementInvalid: PG::UndefinedColumn: ERROR:  column "dname" does not exist

如何获取dnames数组?有没有类似pluck的方法,对as定义的列名alias起作用。
我可以的

Client.select("name as dname").map{|d| d.dname}

但循环查看每一条记录对我来说毫无意义

m2xkgtsf

m2xkgtsf1#

我对勇气的理解是错误的。从apidock我了解到
使用pluck作为快捷方式来选择一个或多个属性,而无需加载一堆记录来获取您想要的属性。
那么

Client.select("name as dname").pluck(:dname)

应该这样写

Client.pluck(:name)
0dxa2lsx

0dxa2lsx2#

使用此代码:

Client.select("name as dname").map{|d| d.dname}
mkh04yzy

mkh04yzy3#

selectpluck不能很好地配合使用,但我使用了一种变通方法,将别名列连接到查询对象上,允许pluck。我通常将这样的连接编写为以with_开头的作用域

class Client
  scope :with_dname , -> {
    # Build a subquery SQL snippet
    # Since we will be joining it onto the base table, we need to select the id column as well
    subquery = select("name AS dname, #{table_name}.id").to_sql

    # join the subquery to base model
    joins("JOIN (#{subquery}) as addendum ON addendum.id = #{table_name}.id")
  }
end

# this will work 
Client.with_dname.first.pluck(:dname) #=> ["Google"]

# this may be more efficient
Client.limit(1).with_dname.first.pluck(:dname) #=> ["Google"]

相关问题