Лучшая реализация многомодельной ассоциации в рельсах?
-
10-07-2019 - |
Вопрос
Ладно, тут Rails-нуб, :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 для получения продуктов, к которым у Боба есть доступ, затем .each из них и поиска клиентов, связанных с каждым продуктом, а затем объединения их в один массив.Но является ли это ЛУЧШИМ способом?
Спасибо!
Решение
Не уверен, что это то, что вы ищете, но если вы хотите удалить всех неавторизованных клиентов для конкретного пользователя:
пользователь = текущий_пользователь
@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
По сути, поиск всех клиентов, затем перебор связанных авторизованных продуктов и удаление их из списка, по сути создание списка неавторизованных клиентов.затем снова выполните поиск и удалите неавторизованных клиентов и клиентов, уже назначенных в группу..Но у меня кончился скотч..какие-нибудь лучшие решения?