Лучшая реализация многомодельной ассоциации в рельсах?

StackOverflow https://stackoverflow.com/questions/1441303

Вопрос

Ладно, тут 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

По сути, поиск всех клиентов, затем перебор связанных авторизованных продуктов и удаление их из списка, по сути создание списка неавторизованных клиентов.затем снова выполните поиск и удалите неавторизованных клиентов и клиентов, уже назначенных в группу..Но у меня кончился скотч..какие-нибудь лучшие решения?

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top