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

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

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

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

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

Q&A

解決済

3回答

1978閲覧

has_many でもってるレコードが存在するかどうかの boolean を取り出したい

退会済みユーザー

退会済みユーザー

総合スコア0

MySQL

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

Ruby on Rails

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

Active Record

Active Recordは、一つのオブジェクトに対しドメインのロジックとストレージの抽象性を結合するデザインパターンです。

0グッド

0クリップ

投稿2019/05/23 10:57

編集2019/06/06 06:14

user_statuses テーブルに fk: user_id と status_id があって
users から has_many で関連付けられています

ユーザ一覧画面で
たとえば status_id = 100 のレコードをもつかどうかを表示したい場合どうかけばいいのでしょうか

status_id = 100 @users = Users.includes(:user_statuses) .select("count(CASE WHEN user_statuses.status_id = #{status_id} THEN 1 ELSE NULL END) AS user_status_#{status_id}")

のようにかいてみたんですが

Mysql2::Error: Unknown column 'user_statuses.status_id

といわれてしまいます

追記

ユーザーとステータスは1対多です

ほしいデータは「ユーザごとに」ステータスがONかOFFかというboolean情報で

     ステータス100  名前  属性いろいろ… ユーザ1:  ◯ user1 abc ユーザ2:  ☓ user2 def ユーザ3:  ☓ user3 ghi

のように表示したいです

User.where(status_id: 100)
でしぼってしまうとONのユーザしか取得できず一覧にユーザ自体が表示されなくなります
なので select でカラムを追加してそこにステータスがONかOFFかを格納したいです

追記

テーブル定義は必要なカラムだけですがこんな感じです

class CreateUsers < ActiveRecord::Migration def change create_table :users do |t| : end end end class CreateUserStatuses < ActiveRecord::Migration def change create_table :user_statuses do |t| t.references :user, null: false, foreign_key: true, index: true t.int :status_id, null: false end end end

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

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

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

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

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

guest

回答3

0

ベストアンサー

「ユーザーとステータスは1対多です」ということでしたら、UserStatus は不要です。敢えて使うこともありますが。
Status に user_id を作って下さい。
class User
has_many :statuses
end

class Status
belongs_to :user
end

で、
left_outer_joins を使って下さい
User.includes(:statuses).left_outer_joins(:statuses).where("statuses.id" => 100)
かな、、、

投稿2019/06/04 13:56

winterboum

総合スコア23324

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

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

退会済みユーザー

退会済みユーザー

2019/06/06 06:49

left_outer_join というメソッドがなく調べると Rails 5 以降の昨日みたいです `joins('LEFT OUTER JOIN user_statuses on ...)` とSQLを直書きすればできました ありがとうございます
guest

0

ベストな方法かはわかりませんが、テーブル定義などが不明なので。

counter_cacheとかcounter_culture(gem)とかを利用して見たらどうでしょうか?

頻繁にクエリが流れるならこの方が管理は楽だと思いますよ。
counter_cacheの使う想定に近いと思いますし。

投稿2019/05/30 00:45

odyu

総合スコア548

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

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

0

テーブル定義がよくわからないのですが、ユーザーとステータスは1対多ですか?多対多ですか?

user_statuses て中間テーブルの名前のような気がするのですが中間テーブルから直接データ取ってくる必要ありますかね?
一対多なら
User.where(status_id: 100).present?的なので取れるはずだし
多対多なら

User.includes(:status).where( etc...
とかで取れるようになってるはず

投稿2019/05/23 16:40

koskacts

総合スコア145

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

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

退会済みユーザー

退会済みユーザー

2019/05/24 01:47

回答ありがとうございます 説明が足りなくて申し訳ないです 質問に追記しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.49%

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

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

質問する

関連した質問