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

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

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

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

Q&A

解決済

1回答

786閲覧

ransackのスコープが認識されない

PartyKids

総合スコア65

Ruby on Rails

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

0グッド

0クリップ

投稿2017/10/06 04:43

閲覧ありがとうございます!
いくら探しても、問題が解決できないのでよろしくお願いいたします!

前提

ruby:2.4.1
rails 5.0.2

Happyset tableHappyset_drink tableDrink table
happyset_namehappyset_iddrink_name
drink_id
quantity

ruby

1------------- Appication Record -------------- 2class Happyset < ApplicationRecord 3 has_many :happyset_drinks 4 has_many :drinks, through: :happyset_drinks 5 6 scope :coke, -> { joins(:happyset_drinks, :drinks).select("happysets.*, happyset_drinks.*, drinks.*").where("drink_name=?", "coke")} 7 8 class << self 9 def ransackable_scopes(auth_object = nil) 10 [:coke] 11 end 12 end 13end 14 15class HappysetDrink < ApplicationRecord 16 belongs_to :happyset 17 belongs_to :drink 18 19end 20 21class Drink < ApplicationRecord 22 has_many :happyset_drinks 23 has_many :happysets, through: :happyset_drinks 24end 25 26-------------- Controller ----------------- 27class HappysetsController < ApplicationController 28 def index 29 @q = Happyset.ransack(params[:q]) 30 @happysets = @q.result 31 end 32end 33 34------------- Seeds.rb ------------------- 35Drink.create(drink_name: "coke") 36Drink.create(drink_name: "sprite") 37Drink.create(drink_name: "orange") 38Drink.create(drink_name: "water") 39 4030.times do |n| 41 Happyset.create(happyset_name: "happyset#{n}") 42 HappysetDrink.create(happyset_id: n, drink_id:1 ,quantity:rand(6)) 43 HappysetDrink.create(happyset_id: n, drink_id:2 ,quantity:rand(6)) 44 HappysetDrink.create(happyset_id: n, drink_id:3 ,quantity:rand(6)) 45 HappysetDrink.create(happyset_id: n, drink_id:4 ,quantity:rand(6)) 46end

最終的には、ハッピーセット名の検索やドリンクの個数からハッピーセット名を検索したいです。

問題点:Happyset.ransack(coke)がerrorになってしまう。

Happyset.rbにコーラを有しているtableを表示出来るようにscopeを使用してみました。

console

1>> Happyset.coke 2SELECT happysets.*, happyset_drinks.*, drinks.* FROM "happysets" 3INNER JOIN "happyset_drinks" ON "happyset_drinks"."happyset_id" = "happysets"."id" 4INNER JOIN "happyset_drinks" "happyset_drinks_happysets_join" ON "happyset_drinks_happysets_join"."happyset_id" = "happysets"."id" 5INNER JOIN "drinks" ON "drinks"."id" = "happyset_drinks_happysets_join"."drink_id" 6WHERE (drink_name='coke') 7 8>> Happyset.ransack(coke) 9NameError: undefined local variable or method `coke' for main:Object 10

ransackの変数のスコープ範囲がおかしいから、Name Errorが出るのかな?と思い、ransackable_scopesをいろいろな書き方を試してみたのですが出来ませんでした。

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

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

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

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

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

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

guest

回答1

0

ベストアンサー

.ransackには、検索パラメーターをハッシユで渡します。

ruby

1Happyset.ransack(coke: true)

投稿2017/10/06 05:29

maisumakun

総合スコア145121

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

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

PartyKids

2017/10/06 08:23

返信ありがとうございます! Happyset.ransack(coke: true).result.to_sqlでransackを使わない時のSQLと同様になりました。 >検索パラメーターをハッシユで渡します controllerのparams[:q]がハッシュになっているからハッシュで渡す必要があるんですね? もう一つ質問してもよろしいですか?我儘言って申し訳ないです。 最終的には、Happyset controllerからドリンク個数でハッピーセットの種類を検索するのが目標なのですが、 Happyset.ransack(coke: true).firstをしてもundefined method `first'が出てしまいます。 Happyset.coke.firstだと上手く値を取得することが出来るのですが。。。。 ransack officialのread meを読んでるのですが、ransackの理解不足なのか、それともSQLの理解不足なのか、もしくはrubyの理解不足なのかが分からず悪戦苦闘しております。 よろしくお願いいたします!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問