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