1

好的,这里是 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

我对 Rails 的粗鲁经验未能让我了解如何最好地构建能够容纳他的客户列表的阵列。

我想的方式是使用@bob.products 来获取 Bob 可以访问的产品,然后访问 .each 并找到与每个产品关联的客户,然后将它们加入一个数组。但这是最好的方法吗?

谢谢!

4

2 回答 2

1

不确定这是否是您要查找的内容,但如果您想删除特定用户的所有非授权客户端:

用户 = 当前用户

@clients_access = Array.new

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

@clients_access.flatten!

于 2009-09-18T16:06:04.013 回答
0

好的,所以我通过以下方式实现了我想要的功能:

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

基本上,找到所有客户,然后遍历链接的授权产品并将它们从列表中删除,基本上创建一个非授权客户列表..然后再次进行搜索并清除非授权客户和已经存在的客户分配在小组中..但是,我的胶带用完了..有更好的解决方案吗?

于 2009-09-17T22:47:55.637 回答