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

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

新規登録して質問してみよう
ただいま回答率
86.02%
Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

Q&A

解決済

railsでWhere文で複数条件を追加(〜以上、〜以下)する書き方が分からず、SQLite3::SQLException: unrecognized token: ":"が出てしまう。

naoki_program
arisa_program

総合スコア5

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

2回答

0グッド

0クリップ

256閲覧

投稿2022/11/06 10:11

前提

自分の音域に合わせて曲を表示するシステムを作っています。
postとuserにはどちらもmin_sound、max_soundが設定されており、ユーザーのmin_sound以上max_sound以下だけの曲を表示する際に以下のエラーメッセージが発生しました。

実現したいこと

ここに実現したいことを箇条書きで書いてください。

  • 自分の音域に合わせて曲を表示する

発生している問題・エラーメッセージ

曲を表示する際に以下のエラーメッセージ が発生しました。

ActiveRecord::StatementInvalid in StaticPages#home music_app/app/views/posts/_posts.html.erb where line #2 raised: SQLite3::SQLException: unrecognized token: ":": SELECT "posts".* FROM "posts" WHERE (min_sound_id: > 1 and max_sound_id: < 16) ORDER BY "posts"."created_at" DESC LIMIT ?

該当のソースコード

min_sound_idとmax_sound_idはmin_sound、max_soundモデルがそれぞれあり、usersとpostsどちらも外部キーに設定してあります。

ruby

1#static_pages_controller.rb 2class StaticPagesController < ApplicationController 3def home 4@posts=Post.all.order(created_at: "desc").limit(10) 5if current_user 6 @user=User.find(current_user.id) 7 @min_sound = @user.min_sound.name 8 @max_sound = @user.max_sound.name 9 @easysongposts = @posts.where("(min_sound_id: > ?) and (max_sound_id: < ?)",@user.min_sound.id,@user.max_sound.id).order("created_at DESC").limit(10) 10end 11end 12end

ruby

1#home.html.erb 2<% if logged_in? %> 3 <%= render 'posts/posts', heading:"歌いやすい曲 #{@min_sound}#{@max_sound}", posts: @easysongposts,link: "/users/easysong/#{@user.id}" %> 4<% end %> <!-- logged_in? -->

ruby

1#user.rb 2class User < ApplicationRecord 3 belongs_to :max_sound 4 belongs_to :min_sound 5end

ruby

1#post.rb 2class Post < ApplicationRecord 3 belongs_to :max_sound 4 belongs_to :min_sound 5end

ruby

1#_posts.html.erb 2<h2 class="heading"><%= heading %></h2> 3<% if posts.blank? %> 4 <div class="post-nil"> 5 <h3>まだありません</h3> 6 </div> 7<% else %> 8 <div class="posts"> 9 <% posts.first(10).each do |post| %> 10 <div class="post"> 11 12 <%= link_to post,target: "" do %> 13 14 <%= image_tag post.picture.url if post.picture? %> 15 <% end %> <!-- link_to post --> 16 <div class="post-top"> 17 <p class="post-title"><%= link_to post.title.truncate(30),post,target: "" %></p> 18 <p class="post-title"><%= link_to post.singer.truncate(30),post,target: "" %></p> 19 20 </div> <!-- post-top --> 21 <div class="post-bottom"> 22 23 <p class="heart-count"><%= post.likes.count %>件いいね</p> 24 </div> <!-- post-bottom --> 25 </div><!-- post --> 26 <% end %><!-- each--> 27 </div> <!--posts --> 28 <h3 class ="read-more"><%= link_to "もっと見る", link,target: "" %></h3> 29<% end %>

ruby

1Rails.application.routes.draw do 2root 'static_pages#home' 3get 'users/easysong/:id', to: 'users#easysong' 4resources :posts

試したこと

ここに問題に対して試したことを記載してください。
static_pages_controller.rbの@easysongposts = @posts.where("(min_sound_id: > ?) and (max_sound_id: < ?)",@user.min_sound.id,@user.max_sound.id).order("created_at DESC").limit(10)のwhere文をなくしたところ曲が新着順に表示されたので、where文に問題があると考えています。

補足情報(FW/ツールのバージョンなど)

rails5.1.6

以下のような質問にはグッドを送りましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

グッドが多くついた質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

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

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

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

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

Orlofsky

2022/11/06 10:24

質問に参考にした書籍名やURLを追記しては?

回答2

2

ベストアンサー

一般的に「複数の条件で絞り込む」には no1knows さんの方法がありますが、naoki_program さんの方法もあります。
ただ書き方がちょっと間違えてます。
"(min_sound_id: > ?) and (max_sound_id: < ?)" ではなく
"(min_sound_id > ?) and (max_sound_id < ?)" に。
エラーメッセージに unrecognized token: ":" ってあるのでそこに着目。
( ) は外しても大丈夫です
naoki_program さんの書き方は ? に引数を割り当てて SQL文を作るので、そのままですと
where (min_sound_id: > 10) and (max_sound_id: < 20) となって、column名の所が コロンがついてしまうのでエラーになりました、

投稿2022/11/06 11:56

winterboum

総合スコア22593

arisa_program, no1knows👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

1

AND条件は、where条件をチェインすることで構成できます。

Ruby

1Customer.where(last_name: 'Smith').where(orders_count: [1,3,5]))

https://railsguides.jp/active_record_querying.html#and%E6%9D%A1%E4%BB%B6

投稿2022/11/06 10:38

no1knows

総合スコア3363

arisa_program👍を押しています

良いと思った回答にはグッドを送りましょう。
グッドが多くついた回答ほどページの上位に表示されるので、他の人が素晴らしい回答を見つけやすくなります。

下記のような回答は推奨されていません。

  • 間違っている回答
  • 質問の回答になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

このような回答には修正を依頼しましょう。

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

ただいまの回答率
86.02%

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

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

質問する

関連した質問

同じタグがついた質問を見る

Ruby on Rails 5

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

Ruby

Rubyはプログラミング言語のひとつで、オープンソース、オブジェクト指向のプログラミング開発に対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。