Railsでのマルチモデルアソシエーションの最適な実装
-
10-07-2019 - |
質問
さて、ここにRails Noob、:D
has__many:throughは多対多の関係を処理するための最新の最高の方法のように見えますが、私はこれをシンプルにしようとしています。うまくいけば、あなたの第一人者がこの状況を以前に処理したことがあります:
ここに、私が現在持っている基本的なモデルのセットアップを示します。
class User < ActiveRecord::Base
has_and_belongs_to_many :products
end
class Product < ActiveRecord::Base
has_and_belongs_to_many :users
has_and_belongs_to_many :clients
end
class Client < ActiveRecord::Base
has_and_belongs_to_many :products
end
本質的に、システムにはユーザーがおり、作成中のさまざまな製品に(関連付けを介して)アクセスできます。これらの製品には多くのクライアントがいますが、クライアントは多くの製品の一部でもあり、製品多くのユーザーがアクセスします。
すべての関連付けは正常に機能していますが、ユーザーに製品にクライアントを追加できるようにしたいのですが、アクセスできる製品に関連付けられているクライアントのみが表示されます。
Scenario:
Given Bob has access to product A and B
And does NOT have access to product C
And and has clients on product B
And wants to add them to product A.
When in product A Bob should see clients from product B in his add list,
And Bob should not see clients from product C
レールに関する私の経験は、彼のクライアントリストを保持するアレイを最適に構築する方法についての経験を提供できません。
私が考えているのは、@ bob.productsを使用して、Bobが.eachにアクセスできる製品を取得し、各製品に関連付けられたクライアントを見つけて、それらを単一の配列に結合することです。しかし、これが最良の方法ですか?
ありがとう!
解決
これがあなたが探しているものかどうかはわかりませんが、特定のユーザーのすべての非認証クライアントを削除したい場合:
user = current_user
@clients_access = Array.new
user.products.each {| p | @ clients_access.push(p.clients).uniq! }
@ clients_access.flatten!
他のヒント
申し分なく、次の方法で必要な機能を実現しました。
user = current_user
@clients_no_access = Client.find(:all, :order => :business_name)
user.products.each do |product|
@clients_no_access -= product.clients
end
@all_clients = Client.find(:all,
:order => :business_name) - @clients_no_access - @product.clients
基本的に、すべてのクライアントを検索し、リンクされた承認済みの製品を反復処理してリストから削除し、基本的に未承認のクライアントのリストを作成します。グループに既に割り当てられているクライアント..しかし、私はダクトテープを使い果たしました..より良い解決策はありますか?