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

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

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

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

Q&A

解決済

1回答

193閲覧

DBから特定の条件をもつデータの集合を取得したい

Sigma1630

総合スコア36

Ruby on Rails

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

0グッド

0クリップ

投稿2019/05/27 15:06

以下のようなwordsテーブルから、nameがn文字になっているデータのみ取得するスコープを作りたいです。

idname
1たけやぶやけた
2たけしたどおり
3しんぶんし
4おしょくじけん
5よのなかねかおかおかねかなのよ

ruby

1#Word.rb 2 3class Word < ApplicationRecord 4 scope :length_of,-> (n) { 5 "文字数がn文字のデータを絞り込む処理" 6 } 7#省略

この状態でコントローラーで特定の文字数のnameを持つdataの集合を取得したいです。下の場合は5文字のnameのデータの集合を@wordsに入れたいです。

ruby

1#xxx_controller.rb 2def index 3 @words = Word.length_of(5) 4end

このときのscopeの中身をどのようにかけば期待する動作が得られるかわからず、困っております。例えば

ruby

1#Word.rb 2 3class Word < ApplicationRecord 4 scope :length_of,-> (n) { 5 where(name.count:n) 6 } 7#省略

みたいな形で、where内にcountメソッドが使えたりすればいけるかなと思いましたが、ハッシュにcountメソッドを使うなどはできませんでした。

良い手があれば教えてください。よろしくお願いいたします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

直接SQLを書くのが手っ取り早いかと思います。

ruby

1 scope :length_of,-> (n) { 2 # MySQL、PotsgreSQLの場合 3 where('CHAR_LENGTH(NAME) = ?', n) 4 # SQLite、PotsgreSQLの場合 5 # (MySQLでLENGTHを使うとバイト数カウントになる) 6 where('LENGTH(NAME) = ?', n) 7 }

投稿2019/05/28 00:30

maisumakun

総合スコア145183

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

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

Sigma1630

2019/05/28 01:17

ありがとうございます!length関数があったのですね。 今回はSQLにlength関数があったのでいけましたが、自作の判定用メソッドが必要そうな処理(例:回文を抜き出す)の場合は諦めるしかないでしょうか?
maisumakun

2019/05/28 01:19

DB側でストアドを組んでそこで処理させるか、いったん全部Railsに取ってきてからEnumerable#selectでピックアップするか、という形になるかと思います。 (頻繁にそういうチェックをするのであれば、非正規形とはなりますが「回文フラグ」を入れておくのも一案です)
Sigma1630

2019/05/28 09:19

ありがとうございます、ストアドについて調べてみます。 回文フラグもありですよね!ただ、こういうちょっと複雑な検索条件になるたびにカラムを増やすのも良くないなと思い、このような質問をさせて頂きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問