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

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

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

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

Ruby on Rails

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

Q&A

解決済

2回答

2169閲覧

Modelからwhereでactive recordを抽出して独自のorderをかける

Hello

総合スコア25

Ruby

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

Ruby on Rails

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

0グッド

0クリップ

投稿2016/10/25 11:54

下記のようなモデルがあり、独自の条件で抽出することにチャレンジしています。

Noteモデル
id:integer
title:string
content:text
category:string

下記が独自の条件(数字はidです。)
arr = [4, 1, 5, 2, 3]

binding.pryで該当箇所を止めて

Note.where(id: arr)を実行すると
=> id:1
title:xxxx
content:xxxx
category: xxxx

id:2
title:xxxx
content:xxxx
category: xxxx

id:3
title:xxxx
content:xxxx
category: xxxx

<以下、arr分続く>

上記のようにsortされた形で返ってきてしまうので、下記のように書き換えました。

Note.where(id: arry).order(['field(id, ?)', arry])
=> [4, 1, 5, 2, 3]

想定通りの結果が返ってきたのですが、上記のように、titleやcontentが得られませんでした。
viewでこの順番でNoteを表示したいので、アドバイス頂けますと幸いです。

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

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

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

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

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

guest

回答2

0

あまり詳しくないのですが、この記事が近いかなと思います。
http://ja.stackoverflow.com/questions/11972
ActiveRecordのバージョンとか、ご利用のDBに依存するようなので、その辺りもご確認ください...。

MySQLでactiverecord-4.2.4だと、こんな感じでした。
Note.where(id: arry).order("field(id, #{arry.join(',')})")

投稿2016/10/25 13:59

編集2016/10/25 14:00
suama

総合スコア1997

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

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

Hello

2016/10/25 15:54

ありがとうございます。確認させていただきます。
Hello

2016/10/26 01:31

suamaさん ご回答ありがとうございました。 ご回答頂いたにも関わらず、完全に私の記載不足で全くもって恐縮ですが、今回、SQLiteを利用しており、頂いたご回答ですと、思い通りの結果が得られませんでした。 Mysqlの環境下で動くかどうかまだ実験していないのですが、Mysqlの環境で試してみます。 以後、質問の際には気をつけます。
guest

0

ベストアンサー

ActiveRecord::Relationで取得したい場合はgemを使うなどした方が良いかもしれませんが、そのままviewにその順序で渡したいだけであれば、下のようにwhereでレコードを取得してから、取得に使ったidの配列のmapでそのidに該当するレコードを取得したレコードから取得していく方法もあります。

ruby

1# 取得したいidの配列 2arr = [4, 1, 5, 2, 3] 3 4notes = Note.where(id: arr) 5 6@notes = arr.map{ |id| notes.to_a.find{ |note| note.id == id } }

こちらはSQL発行回数が増えますが

ruby

1@notes = arr.map{ |id| Note.find(id) }

のようにも書けます.

投稿2016/10/25 13:55

cameluby

総合スコア891

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

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

Hello

2016/10/25 15:54

ありがとうございます。確認させていただきます。
Hello

2016/10/26 01:30

camelubyさん ご回答ありがとうございました。 2つ目に頂いたご回答で無事、発行することができました。 先日に引き続き助けて下さり誠にありがとうございます。 ※ご回答頂いたにも関わらず、完全に私の記載不足で全くもって恐縮ですが、今回、SQLiteを利用しており、頂いた最初の方のご回答ですと、思い通りの結果が得られませんでした。 Mysqlの環境下で動くかどうかまだ実験していないのですが、Mysqlの環境で試してみます。 解決に至ったので、ベストアンサーとさせていただきたいと思います。
cameluby

2016/10/26 03:08

解決したようで良かったです。 SQLiteではfield関数が使えないので、DBに依存しない解決法として回答させてもらいました。 この方法でしたらMySQLでもPostgresqlでも動くと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問