3

谁能告诉我如何在 select_value 中编写查询。

我试过了,

    ActiveRecord::Base.connection.select_value("select count(*) from leave_details where status= 'Pending' and 'employeedetails_id'=25")

但它显示错误

   invalid input syntax for integer: "employeedetails_id".

我正在使用 PostgreSQL。

4

2 回答 2

7

单引号用于引用 PostgreSQL 中的字符串(以及甚至假装尊重 SQL 标准的所有其他 SQL 数据库),所以你说的是这样的:

some_string = some_integer

当你这样做时:

'employeedetails_id'=25

这没有任何意义:如果没有明确的类型转换,您将无法比较字符串和整数。您根本不需要引用该标识符:

ActiveRecord::Base.connection.select_value(%q{
    select count(*)
    from leave_details
    where status = 'Pending'
      and employeedetails_id = 25
})

如果您甚至确实需要引用标识符(可能区分大小写或包含空格),那么您将在 PostgreSQL 中使用双引号。


显然,您创建的列"EmployeeDetails_id"是区分大小写的。这意味着您总是必须使用这种情况,并且总是必须双引号:

ActiveRecord::Base.connection.select_value(%q{
    select count(*)
    from leave_details
    where status = 'Pending'
      and "EmployeeDetails_id" = 25
})

我建议您修改您的表格以不使用​​混合大小写标识符:

  1. 它们违背了标准的 Ruby/Rails 命名。
  2. 它们迫使您在使用它们的任何地方都使用混合大小写的列名双引号。
  3. 他们违背了标准的 PostgreSQL 实践。

这会让你一次又一次地绊倒。

于 2012-10-23T05:15:00.957 回答
1

直接执行 SQL 并不是真正的 Rails 方式,这样做会失去任何数据库的可移植性。

您应该为 leave_details 创建一个模型。例如

rails g model LeaveDetails status:string employeedetails_id:integer

然后,代码将是:

LeaveDetails.where({ :status => 'Pending', :employeedetails_id => 25 }).count
于 2012-10-23T05:24:17.580 回答