「仮想関連付け」と呼んでいるものをレールのモデルに実装する方法についてのガイダンスを探しています。
この前に、実際の関連付けパス (HABTM) を使用することを検討したという免責事項を示しますが、これは私が既に実装した概念と競合することがわかります。
現在、を介してオブジェクトProject
に関連付けることができるモデルがあります。例として、a には多数の、およびが含まれる場合があります。Aは、同じまたは異なるものを表すこともできます(単一テーブルの継承を除外します)。User
roles
Project
site_managers
construction_managers
project_managers
site_manager
project_manager
projects
Rolify gem を使用すると、これを実装するのはかなり簡単です。上記の役割のいずれかを特定のプロジェクトとして特定のユーザーに割り当てることができますsample_user.add_role(:site_manager, sample_project)
.
私の目標の 1 つは、新しいプロジェクトをセットアップできるフォームを作成し、複数選択リストを使用してユーザーにロールを割り当てることができるようにすることです。例として、私のフォームには、選択したユーザーを新しいプロジェクトのサイト マネージャーとして割り当てるための次の入力があります。
= f.input :site_managers, collection: User.all, input_html: { multiple: true }
(フォーマスティック DSL)
ここで、少し複雑になります。site_maanagers
フォームから渡された user_ids のハッシュを取得し、必要に応じて適切なレコードを取得/更新できる属性のカスタム getter/setter を実装することができました。
ただし、この実装は、 withに 1 つuser
を追加するなどのことができる実際の関連付けの実装とはほど遠いものです。site_managers
sample_project.site_managers << sample_user
現時点では、ユーザー インスタンスを使用して site_managers の配列を設定することもできません。私のカスタム セッターuser_ids
は、フォーム送信の実装の外部で使用する場合、少し面倒で直感的ではない引数としてのみ受け取ります。セッターメソッド内の型をチェックすることでこれを簡単に回避できますが、ハッカーのように感じられ、Rails とはあまり似ていません。
カスタムゲッター/セッター全体を捨てて、結合テーブルを使用してこれらすべてのレコードを管理するHABTM実装を使用しようとしましたが、プロジェクトにさらにロールを追加する必要がある場合、これがうまくスケーリングされないことが懸念されます(各ロールは結合テーブルに追加の列を追加します)。また、Rolify で既に提供されている機能/概念を複製しているように感じてしまうので、ある場所では結合テーブルのロールをチェックし、他の場所では Rolify を使用しています (つまり、ユーザーが管理者であるか、特定のリソース)。
私が見落としている可能性のあるものは他にありますか、それともこれを行う唯一の方法ですか?
ありがとうございます。皆様のご意見をお待ちしております。
ログ