Лучшая реализация мультимодельной ассоциации в рельсах? - PullRequest
1 голос
/ 18 сентября 2009

Хорошо, Рельс Нуб здесь,: D

Похоже, has__many: сквозной это последний лучший способ справиться со многими отношениями, но я пытаюсь сделать это простым. Надеюсь, один из вас, гуру, уже справлялся с этой ситуацией раньше:

Вот базовая модель, которую я сейчас имею:

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 для получения продуктов, к которым у Боба есть доступ, затем к каждому. Найти клиентов, связанных с каждым продуктом, а затем объединить их в один массив. Но разве это ЛУЧШИЙ способ?

Спасибо!

Ответы [ 2 ]

1 голос
/ 18 сентября 2009

Не уверен, что это то, что вы ищете, но если вы хотите удалить все неавторизованные клиенты для определенного пользователя:

пользователь = current_user

@ clients_access = Array.new

user.products.each {| p | @ Clients_access.push (p.clients) .uniq! }

@clients_access.flatten!

0 голосов
/ 18 сентября 2009

Хорошо, поэтому я достиг желаемой функциональности следующим образом:

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

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

...