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

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

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

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

Q&A

解決済

1回答

1666閲覧

has_many関連だが、has_oneのように使う方法について

Kimsehwa

総合スコア312

Ruby on Rails

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

0グッド

0クリップ

投稿2020/10/03 21:25

ruby on Railsの関連付けについて質問させてください。

userとorganizationモデルそしてuserごと持ってる組織情報のデータを管理するuser_organizationモデルがあります。

ですので、user_organizationはuser_idとorganization_idを両方持ってます。

userは複数のuser_organizationモデルを持ってるのでhas_many扱いが正しいかもですが、
実際はorganization_idをfind_byして使うためhas_one扱いの場合が多いです。

ただ、
この場合、userとuser_organizationの関連付けをhas_oneのように使う方法がわかりませんでした。

以下の記事を参考して
has_oneに引数を追加してみましたが、正常に動きません。

https://stackoverflow.com/questions/30144950/rails-has-many-and-has-one-with-argument

#app/models/user.rb has_one :user_organization, -> (org) { where organization_id: org.id}, class_name: 'UserOrganization'
User.first.user_organization => nil User.first.user_organization(Orgnization.first) => ArgumentError: wrong number of arguments (given 1, expected 0)

何かいい方法がありましたら教えていただけますでしょうか。

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

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

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

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

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

guest

回答1

0

ベストアンサー

  1. あたかも 多対多の様な関連宣言のままで「でもuser と UserOrganisationは1:1なんだよね」と意識してつかう
  2. 一応 user には UserOrganizationはひとつだけ という vallidationは作っておく
  3. has_one :user_organization として使う。, -> (org) { }なし。

あたりかな。

3は、
user.organization(s) という使い方はできませんが user.user_organization.organization は出来る。def organization を作っておけば user.organization も使える(表示なら)

UserOrganization に organization_id があるから、多対多の中間テーブルにみえますが、それがなければ単に Userにbelongs_toしている1:1な関連。
右半身と左半身を分離して考えたら良いのでは

User と Organization の関連を残しておく必要があるなら 1か2。

投稿2020/10/04 04:29

winterboum

総合スコア23567

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

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

Kimsehwa

2020/10/07 03:37

大変ヒントになりました。ありがとうございます。 以下の方法で解決しました。 ``` attr_accessor :org_id has_one :org_user, ->(object) { where(organization_id: object.org_id) } ```
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.36%

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

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

質問する

関連した質問