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

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

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

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

Q&A

解決済

1回答

356閲覧

formにSQLを追加する(ransack)

PartyKids

総合スコア65

Ruby on Rails

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

0グッド

0クリップ

投稿2017/10/11 09:23

閲覧ありがとうございます!
ドリンクの個数からハッピーセットを検索したいのですが、多対多を使うと上手く実装できません。

前提

ruby:2.4.1
rails 5.0.2

Happyset tableHappyset_drink tableDrink table
happyset_namehappyset_iddrink_name
drink_id
quantity

ruby

1---------- index.html.erb ------------ 2<%= search_form_for(@q, url: happysets_index_path, enforce_utf8: false) do |f| %> 3 <div class="form-group"> 4 <%= f.label :coke_and_drink_eq, 'コーラの個数を選んで' %> 5 <%= f.select :coke_and_drink_eq, @option, :include_blank => true %> 6 7 <%= f.submit %> 8 </div> 9 <% end %> 10 11--------- happyset.rb ------------- 12scope :coke, -> (drink_name = "coke") { 13 joins(:drinks).where('drink_name=?', drink_name) 14 } 15 16-------- HappysetsController -------- 17def index 18 @q = Happyset.ransack(params[:q]) 19 @happysets = @q.result(distinct: true).includes(:drinks, :happyset_drinks) 20 @option = [1,2,3,4,5,6,7,8,9] 21end

疑問1: 自分が作ったSQLは、どうやったらformの中に埋められるか?

予めscopeでドリンク名を指定し、そこにwhere(happyset_drinks.number=?, form-value)を渡せば出来るかな?と思ったので、f.select :coke_and_drink_eq、っとしてみたが出来ませんでした。andだと、Happyset.coke = 2といったへんなSQLが発行されるから当たり前なのですが。。。。
ドリンク名を選択するセレクトボックス使えば、やりたいSQLを発行することがきたのですが、ドリンク名を選択せずにセットメニューを検索したいです。

疑問2: where等のSQL使った場合には、ActiveRecordは使えない?

ruby

1set = Happyset.where("happyset_name=?" ,"happyset1") 2set.happyset_name 3=> NoMethodError: undefined method id for <Happyset 4 5set = Happyset.find_by(happyset_name: "happyset1") 6set.happyset_name 7=> happyset1

オブジェクトで操作したい場合は、SQLを使わずにfind_byを使わないと出来ないのですか?

よろしくお願い致します!

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

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

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

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

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

guest

回答1

0

ベストアンサー

疑問1

とりあえず、疑問1はどういうSQLを実行したいのかがよくわかりませんでした。
formからの数字でhappyset_drinksテーブルのquantityで検索かけたいのでしょうか?

ruby

1@happy_sets = Happyset.joins(:drinks, :happyset_drinks).where(happyset_drinks: {quantity: 数字})

こんな感じ?

追記

飲み物が決まっているなら、

ruby

1@happy_sets = Happyset.joins(:drinks, :happyset_drinks).where(happyset_drinks: {quantity: 数字}).where(drinks: {name: 'cola'})

formを開いた時点で飲み物が決まっているなら、hidden_field等で飲み物の名前を送ってやればいいと思います。

疑問2

whereはActiveRecordクラスではなく、ActiveRecord::Relationクラスが返ってきます。
ActiveRecordの配列のようなもので、そこには複数のActiveRecordが入るようになります。
それをActiveRecordクラスにする場合は、.firstをつけましょう。
find_byとやってることは一緒ですが。

投稿2017/10/12 08:31

編集2017/10/13 03:25
chelsy7110

総合スコア596

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

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

PartyKids

2017/10/12 11:17

コメントありがとうございます! >どういうSQLを実行 コーラが5個あるハッピーセットは?といった検索をしたいので、 SQLは、`@happy_sets = Happyset.joins(:drinks, :happyset_drinks).where(happyset_drinks: {quantity: 数字} AND drinks:[drink_name: ドリンク名])`です。 labelにドリンク名、個数はselect boxから選択するみたいな機能です。 `f.select :happyset_drinks_quantity_eq`だと指定した個数を有する、全種類のドリンクが検索されてしまい、どうやったらドリンク名を指定したものを組み込めるのか模索中です。 個数指定前にドリンクを指定するセレクトボックスを作ればうまくいくのですが、ドリンク名は、labelにテキストとして表示させたいです。 >ActiveRecord::Relationクラス ありがとうございます!最近SQLを勉強したばかりですが、ActiveRecord::Relationクラスについても勉強してみたいと思います!
PartyKids

2017/10/12 12:48

すみません。SQL勉強したてで間違ったSQLを書いてしまいました? >where(happyset_drinks: {quantity: 4} AND drinks:[drink_name: cola]) これだと、colaを有しており、かつ、ドリンク(複数種類)の個数が4個のレコードを探せ!となってしまい、コーラが4個のレコードを探せ!という意味合いではなくなってしまいますよね? よろしくお願いいたします。
PartyKids

2017/10/14 06:43

追記ありがとうございました! SQL勉強したてで、サブクエリを使えばいいのかな?とおもい色々探していたのですが、whereを連続で書くことが出来るのですね!とても勉強になりました! ありがとうございました!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問