質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.50%
Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

Q&A

解決済

1回答

4641閲覧

PostgreSQLで特定のカラムのinteger型をtext型に変換するコードの書き方

Gr.

総合スコア89

Heroku

HerokuはHeroku社が開発と運営を行っているPaaSの名称です。RubyやNode.js、Python、そしてJVMベース(Java、Scala、Clojureなど)の複数のプログラミング言語をサポートしている。

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Ruby on Rails

Ruby on Railsは、オープンソースのWebアプリケーションフレームワークです。「同じことを繰り返さない」というRailsの基本理念のもと、他のフレームワークより少ないコードで簡単に開発できるよう設計されています。

0グッド

0クリップ

投稿2019/02/06 07:57

タイトルがヘンテコだったらすみません。初心者です。
Railsで練習用アプリを試作し、その練習用アプリをherokuにデプロイしました。

heroku logsで以下のようなエラーが出ました。

ActionView::Template::Error (PG::UndefinedFunction: ERROR: operator does not exist: integer ~~ unknown

LINE 1: SELECT COUNT(*) FROM "books" WHERE (genre1 LIKE '%1%') AND...

Bookモデルのgenre1カラムに「1」というデータが入っているものだけを絞り込むコードでのエラーです。
ローカル環境(sqlite3)では問題なく動きますが、herokuにデプロイ後のPostgreSQLでエラーを吐きます。

調べてみると、「'%1%'」のような表記は文字列型(text)用のものらしく、PostgreSQL8.3以前のバージョンなら対象のカラムを自動でtext型に変換して検索してくれたが8.3以降のバージョンではこれがなくなり、ちゃんと指定しないとエラーを吐くようになってしまったそうです。
参考:PostgreSQLデータベースの自動キャストがなくなった・・・。

解決策として、以下のようにカラム名の直後に「::text」としてやればtext型に変換してくれるようなのですが、

LINE 1: SELECT COUNT(*) FROM "books" WHERE (genre1::text LIKE '%1%') AND...

このようにするためには、どこにどのように「::text」を書けばよいのでしょうか??

参考までに以下Railsのhtmlとcontrollerのコードです。

controller

1def genre 2 @books = Book.page(params[:page]).per(100).where('genre1 LIKE ?', "%#{params[:genre1]}%").where('genre2 LIKE ?', "%#{params[:genre2]}%")... 3  :

html

1<td> 2 <div> 3  1 4  <%= form_tag(genre_books_path, method: "get") do %> 5   <%= text_field_tag :genre, "1" %> 6   <%= submit_tag "" %> 7  <% end %> 8 </div> 9</td>

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答1

0

ベストアンサー

SQLとして記述すれば良いのでは

 @books = Book.page(params[:page]).per(100).where('cast(genre1 as text) LIKE ?', "%#{params[:genre1]}%").where('genre2 LIKE ?', "%#{params[:genre2]}%")...

投稿2019/02/06 08:11

編集2019/02/06 08:31
sazi

総合スコア25138

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

Gr.

2019/02/06 08:25 編集

saziさん 素早い回答ありがとうございます! その場合、ローカル環境(sqlite3)でエラーを吐くことになると思いますが、どちらもエラーなく対処するにはどうすればよいのでしょうか?? そもそもtextにしたのが間違いだったということでしょうか??
sazi

2019/02/06 08:33

DBMSの文法違いが出ないようにすれば良いかと思います。 cast()でtextならいけそうな気もします。※回答を修正しました。
Gr.

2019/02/06 08:43

saziさん 返信ありがとうございます! いただいた回答でsqlite3,postgresqlどちらも対応できました!! 助かりました。ありがとうございました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.50%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問