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

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

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

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

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

Q&A

解決済

3回答

9818閲覧

Railsの中間テーブルのカラムにアクセスするには?

eskey_mo

総合スコア34

Ruby

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

Ruby on Rails

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

Ruby on Rails 4

Ruby on Rails4はRubyによって書かれたオープンソースのウェブフレームワークです。 Ruby on Railsは「設定より規約」の原則に従っており、効率的に作業を行うために再開発を行う必要をなくしてくれます。

Active Record

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

0グッド

0クリップ

投稿2015/08/12 16:57

Railsで以下のようなテーブルがあったとします

1.User
id:integer

2.Team
id:integer

3.TeamMembers
user_id:integer
team_id:integer
abstract:string

このようなテーブルを組んだ時、例えば、以下のようにUserの検索を行ったとします。
@user = User.find(0)

このときTeamのIDも特定した上で中間テーブルへのabstractカラムにはどのようにアクセスすれば良いのでしょうか?
@user.team_memberでコレクションになっているのはみれるんですがteam_idを特定した上でabstractカラムにアクセスする方法がわかりません。
よろしければ回答ください

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

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

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

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

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

guest

回答3

0

ベストアンサー

has_and_belongs_to_many関連の場合、普通には中間テーブルにアクセスできません。
中間テーブルに属性を着けるときは、中間テーブル自身にもidをつけて、has_many trough:を利用するのが正しいです。

Ruby

1# User 2 has_many :team_members 3 has_many trough: :team_members 4 5# TeamMember 6 # id, user_id, team_id, abstract列を持つ 7 belongs_to :user 8 belongs_to :team 9 10# これなら、userのインスタンスからteam_membersにアクセス可能 11@user = User.find(0) 12@team_member = @user.team_members.where(team_id: 1).first 13@team_member.abstract

ですが、すでにこの状態にあって、どうしても中間テーブルの属性にアクセスする必要があるのなら、
生のSQLを使うという手があります。

Ruby

1# 生のSQLを使って取得する 2result = ActiveRecord::Base.connection.select("select abstract from team_members where user_id = 0 and team_id = 1 limit 1") 3# => resultの中身は[{abstract => 'hoge'}] 4result.first[:abstract]

投稿2015/08/12 23:18

編集2015/08/12 23:20
rifuch

総合スコア1901

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

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

eskey_mo

2015/08/15 03:30

やりたいことが行えました。ありがとうございます!
guest

0

rifuch さんの回答と私の考えも同じです。

Rails チュートリアル Active Record の関連付け

2.4 has_many :through関連付け

にあるような状況を作っているのでしょうか?

そうでないなら、
3 つのテーブルの関係をどう定義しているのか
を提示していただけると、さらに別の回答が得られるかもしれません。

投稿2015/08/13 00:50

編集2015/08/13 02:05
katoy

総合スコア22324

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

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

guest

0

TeamMemberは多対多の関係のテーブルなので、TeamIDもパラメータとして渡されないとレコードを特定できないのではないでしょうか?

投稿2015/08/12 22:16

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問