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

标签 ruby-on-rails postgresql select activerecord arel

我的 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/

相关文章:

postgresql - 如何将时间插入 Redshift

mysql - 我的应用程序访问远程数据库。如何有效地运行单元测试?

PHP/MySQL 从选择中复制值

ruby-on-rails - 如何转换字符串以便在 URL 中正确传递它?

ruby-on-rails - 从 RAILS_ROOT 外部运行 rake 任务

postgresql - 如何设置 postgres application_name 日志记录

postgresql - 锁定行直到下一次选择 postgres

ruby-on-rails - 无 Controller 的 rails 路线

ruby-on-rails - 将记录添加到 rails 中的表

mysql : select a "rollback" query (visualizing the rollback query)