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

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

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

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

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

Q&A

解決済

2回答

462閲覧

[Ruby on Rails]条件を複数設定して、レコードの抽出を行いたい

yomigi

総合スコア43

Ruby on Rails 5

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

Ruby

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

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

0グッド

0クリップ

投稿2018/03/22 14:22

Ruby on Railsでのレコード検索について質問をさせていただきます。
条件に沿ったユーザー情報を持ってくる処理を考えております。

現在、自分(ログインユーザー)以外のユーザー情報を取得する為に、

ruby

1@users = User.where.not(id: current_user.id)

といった記述をしています。
また、ユーザーの友達情報を取得する為に、

ruby

1@friends = current_user.friends

といった記述をしています。
(.friendsで友達情報を持ってこれるようにモデル設定しておりますが、割愛いたします)

そして、現在、この二つの情報を使って、
「自分以外であり、かつ自分の友達以外のユーザー」
の情報を取得したいと思っているのですが、どう処理を書けば良いのかわかりません。

どのようにコードを記述すれば、このような情報を取得することができるのでしょうか?
どなたか、ご教授をいただけないでしょうか。よろしくお願いいたします。

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

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

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

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

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

guest

回答2

0

どの場面で使うかにもよりますが、こんなイメージでしょうか。
下記のviewで書いた友達の表示はイマイチです。

  • controller

ruby

1 def index 2 @users = User.others(current_user) 3 end
  • model

ruby

1 class User 2 scope :others, (user) -> { where.not(id: user.id) } 3 end
  • view

html

1 <% @users.each do |user| %> 2 <% user.friends.each |friend| %> 3 <%= friend.name %> 4 <% end %> 5 <% end %>

投稿2018/03/22 14:50

編集2018/03/22 14:54
mikorasu

総合スコア34

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

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

0

ベストアンサー

「自分以外であり、かつ自分の友達以外のユーザー」

というのは、(些末な違いかもしれませんが)「自分と友達以外を含まない」と言い換えできそうですね

素朴に、NOT IN 句を記述してあげると実装の第一歩としてはいいかもしれません

下記 例示のために単純なモデルを作ってみました

何か参考になれば幸いです

ruby

1# == Schema Information 2# 3# Table name: users 4# 5# id :integer not null, primary key 6# name :string 7# created_at :datetime not null 8# updated_at :datetime not null 9# friend :integer 10# 11 12class User < ApplicationRecord 13 scope :friends, -> (id) { where('friend = :id', id: id) } 14 scope :not_me, -> (id) { where('id != :id', id: id) } 15 scope :others, -> (id) { where('id not in (?)', friends(id).pluck(:id) + [id]) } 16end

ruby

1User.others(current_user.id)

ruby

1def init_actors 2 @me = User.create(name: 'me') 3 _friends = 4 Array.new(3) { |i| User.create(name: "friends No.#{i}", friend: @me.id) } 5 _others = 6 Array.new(3) { |i| User.create(name: "others No.#{i}") } 7end 8 9RSpec.describe User, type: :model do 10 context 'scope methods' do 11 subject { User } 12 it { is_expected.to respond_to :friends } 13 it { is_expected.to respond_to :not_me } 14 it { is_expected.to respond_to :others } 15 end 16 17 context 'search friends' do 18 before { init_actors } 19 20 it 'has 3 friends' do 21 expect(User.friends(@me.id).size).to eq 3 22 end 23 24 it 'name includes "friends"' do 25 User.friends(@me.id).each do |user| 26 expect(user.name).to include 'friends' 27 end 28 end 29 30 after { User.destroy_all } 31 end 32 33 context 'search not me' do 34 before { init_actors } 35 36 it 'has 6 records' do 37 expect(User.not_me(@me.id).size).to eq 6 38 end 39 40 it 'name not includes "me"' do 41 User.friends(@me.id).each do |user| 42 expect(user.name).to_not include 'me' 43 end 44 end 45 46 after { User.destroy_all } 47 end 48 49 context 'search not friends and not me' do 50 before { init_actors } 51 52 it 'has 3 records' do 53 expect(User.others(@me.id).to_a.size).to eq 3 54 end 55 56 it 'name includes "others"' do 57 User.others(@me.id).each do |user| 58 expect(user.name).to include 'others' 59 end 60 end 61 62 after { User.destroy_all } 63 end 64end

投稿2018/03/23 13:58

gouf

総合スコア2321

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.47%

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

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

質問する

関連した質問