如何查询activerecord的select_value方法?

时间:2012-10-23 04:56:28

标签: ruby-on-rails ruby-on-rails-3 postgresql

任何人都可以告诉我如何在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。

2 个答案:

答案 0 :(得分:6)

单引号用于引用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实践。
  4. 这会让你一遍又一遍地绊倒你。

答案 1 :(得分:1)

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

您应该为leave_details创建一个模型。 E.g。

rails g model LeaveDetails status:string employeedetails_id:integer

然后,代码将是:

LeaveDetails.where({ :status => 'Pending', :employeedetails_id => 25 }).count