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 に答える