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

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

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

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

Q&A

0回答

200閲覧

has_manyの絞り込み表示

sabamiso

総合スコア14

Ruby on Rails 5

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

PostgreSQL

PostgreSQLはオープンソースのオブジェクトリレーショナルデータベース管理システムです。 Oracle Databaseで使われるPL/SQLを参考に実装されたビルトイン言語で、Windows、 Mac、Linux、UNIX、MSなどいくつものプラットフォームに対応しています。

0グッド

0クリップ

投稿2018/06/18 16:54

やりたいこと

1対多のリレーションを設定している状態で、リレーション先の絞り込み条件したデータを紐づけてリレーション元で表示したい

(実例)
ユーザー(1)対インタビュー(多)のリレーションが設定されている時、ログインしている以外の人のユーザーモデルに登録された情報とその人のインタビューモデルの内、stateが1となっている日付(start_interview)を表示したい(stateの1がnilだった場合、空白を表示する)

ソースコード

ユーザーモデル

ruby

1class User < ApplicationRecord 2 # Include default devise modules. Others available are: 3 # :confirmable, :lockable, :timeoutable and :omniauthable 4 devise :database_authenticatable, :registerable, 5 :recoverable, :rememberable, :trackable, :validatable 6 7 enum sex: {:1,:2} 8 9 has_many :interviews 10 scope :approvaled_interview, -> { joins(:interviews).where('interviews.state = 1') } 11end

インタビューモデル

ruby

1class Interview < ApplicationRecord 2 validate :not_before_today 3 4 def not_before_today 5 if start_interview.present? && start_interview < DateTime.now 6 errors.add(:start_interview, "未来の日付を設定してください") 7 end 8 end 9 10 enum state: { 保留:0, 承認:1, 却下:2} 11 belongs_to :user 12end

ユーザーコントローラー

ruby

1class UsersController < ApplicationController 2 before_action :authenticate_user!, only: :show 3 before_action :sign_in_required, only: [:show] 4 def index 5 @users = User.where.not(id: current_user.id). 6 end 7end

ユーザービュー

ruby

1<h1>ようこそ</h1> 2<p>トップページです。</p> 3<% unless @users.nil? %> 4 <table> 5 <tr> 6 <th>名前</th> 7 <th>Email</th> 8 <th>年齢</th> 9 <th>性別</th> 10 <th>学校名</th> 11 <th>面接日程</th> 12 </tr> 13<% @users.each do |user| %> 14 <tr> 15 <td><%= user.username%></td> 16 <td><%= user.email%></td> 17 <% if user.birthday != nil %> 18 <td><%= (Date.today.strftime("%Y%m%d").to_i - user.birthday.strftime("%Y%m%d").to_i) /10000 %></td> 19 <% else %> 20 <td></td> 21 <% end %> 22 <td><%= user.sex %></td> 23 <td><%= user.company %></td> 24 <td><%= render plain: @interviews.inspect %></td> 25 <td><%= link_to '面接一覧', user_interviews_path(user) %></td> 26 </tr> 27<% end %> 28 </table> 29<% end %>

ユーザーのテーブル構造

sql

1 Column | Type | Modifiers 2------------------------+-----------------------------+---------------------------------------------------- 3 id | bigint | not null default nextval('users_id_seq'::regclass) 4 email | character varying | not null default ''::character varying 5 encrypted_password | character varying | not null default ''::character varying 6 reset_password_token | character varying | 7 reset_password_sent_at | timestamp without time zone | 8 remember_created_at | timestamp without time zone | 9 sign_in_count | integer | not null default 0 10 current_sign_in_at | timestamp without time zone | 11 last_sign_in_at | timestamp without time zone | 12 current_sign_in_ip | inet | 13 last_sign_in_ip | inet | 14 created_at | timestamp without time zone | not null 15 updated_at | timestamp without time zone | not null 16 username | character varying | 17 birthday | date | 18 sex | integer | 19 company | character varying | 20Indexes: 21 "users_pkey" PRIMARY KEY, btree (id) 22 "index_users_on_email" UNIQUE, btree (email)

インタビューのテーブル構造

sql

1 Column | Type | Modifiers 2-----------------+-----------------------------+--------------------------------------------------------- 3 id | bigint | not null default nextval('interviews_id_seq'::regclass) 4 start_interview | timestamp without time zone | 5 state | integer | not null default 0 6 created_at | timestamp without time zone | not null 7 updated_at | timestamp without time zone | not null 8 user_id | bigint | 9Indexes: 10 "interviews_pkey" PRIMARY KEY, btree (id) 11 "index_interviews_on_user_id" btree (user_id)

わからないこと

ログインしていないユーザーでstateが1もしくは、1以外が登録されているという条件をユーザーコントローラー側で絞り込む方法がわかりません。

scopeを使う方法などを試しましたが、うまくいきませんでした。

有識者の方、ご教授お願いいたします。

前提

Ruby on Rails 5
PostgreSQL

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

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

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

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

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

guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問