gpt4 book ai didi

ruby-on-rails - 将 Arel 作为别名应用于 Rails 的 ActiveRecord

转载 作者:行者123 更新时间:2023-11-29 12:27:07 27 4
gpt4 key购买 nike

我的 Rails 项目使用 PostgreSQL。它在 Arel 的别名“as”上遇到了一些问题。

这个有效。

Member.select(:id, Member.arel_table[:name].as("identity"))

它正确获取数据。

Member.select(:id, Member.arel_table[:name].as("identity")).first["identity"] #=> 'John'

问题 1

当谈到count方法时,它失败了。

Member.select(:id, Member.arel_table[:name].as("identity")).count

错误:

: SELECT COUNT(id, #<Arel::Nodes::As:0x0000000988a9b0>) FROM "members"
ActiveRecord::StatementInvalid: PG::SyntaxError: ERROR: syntax error at or near "As"
LINE 1: SELECT COUNT(id, #<Arel::Nodes::As:0x0000000988a9b0>) FROM "...

问题 2

如果用空格别名“as”,则不加引号。

Member.select(:id, Member.arel_table[:name].as("long name"))

错误

PG::SyntaxError: ERROR:  syntax error at or near "name"

LINE 1: ...ECT "members"."id", "members"."name"AS long name FROM ...

如果引用别名,它再次起作用

Member.select(:id, Member.arel_table[:name].as("\"long name\""))

这是 SQL 注入(inject)的潜在原因吗?

在 Arel over PostgreSQL 中使用别名的正确方法是什么?

最佳答案

为什么不直接在您的成员模型中使用 alias_attribute?

添加alias_attribute :long_name, :name 然后就可以使用Member.select(:id, :long_name)

这是经过测试的示例:

class User < ActiveRecord::Base
alias_attribute :stack_name, :username

[142] pry(main)> User.select(:id, :stack_name)
User Load (0.3ms) SELECT "users"."id", "users"."username" FROM "users"
=> [#<User:0x0000000a027628 id: 1, username: "developer">,
#<User:0x0000000a0274c0 id: 2, username: "Swistak">]
[143] pry(main)> _.first.stack_name
=> "developer"

关于ruby-on-rails - 将 Arel 作为别名应用于 Rails 的 ActiveRecord,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28522312/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com