根据Rails中的访问控制规则进行范围查找的最佳方法是什么?

时间:2009-12-09 18:32:41

标签: ruby-on-rails activerecord

我需要根据访问控制规则为范围查找找到一个优雅的解决方案。基本上我有以下设置:

用户 顾客 AccessControl - 定义哪个用户可以访问其他用户数据

用户不仅需要访问自己的客户,还需要能够访问其他用户的共享客户。

显然,像简单关联之类的东西不起作用:

has_many :customers

,这也不会:

has_many :customers, :conditions => 'user_id in (1,2,3,4,5)'

因为关联使用with_scope,并且添加的条件是AND条件而不是OR条件。

我还尝试使用关联扩展来覆盖find和method_missing方法,如下所示:

has_many :customers do
  def find(*args)
    #get the user_id and retrieve access conditions based on the id
    #do a find based on the access conditions and passed args
  end 

  def method_missing(*args)
    #get the user_id and retrieve access conditions based on the id
    #do a find based on the access conditions and passed args
  end
end

但问题是我无法访问扩展方法中的用户对象/父对象,它只是无法按计划工作。

我也试过了default_scope,但是在你无法将一个块传递给默认范围之前已经发布了。

无论如何,我知道在使用rails之前已经完成了数据分段和数据访问控制,我想知道是否有人找到了一种优雅的方法。

更新: AccessControl表具有以下布局

user_id
shared_user_id

customer表具有以下结构:

id
account_id
user_id
first_name
last_name

假设以下数据将在AccessControl表中:

1  1
1  3
1  4
2  2
2  13
and so on...

用户1的account_id为13我需要能够检索使用以下sql语句最佳描述的客户:

select * from customers where (account_id = 13 and user_id = null) or (user_id in (1,3,4))

1 个答案:

答案 0 :(得分:0)

很抱歉,如果我完全错过了这一点,但我不能100%确定你想做什么。 AccessControl是User和Customer之间的关系吗?如果是这样,你只需要建立一个多对多的关系。

class User
  has_and_belongs_to_many :customers   

  # or this if you need to store meta data in the join table 

  has_many :customers
  has_many :access_controls
  has_many :accessible_customers, through => :access_controls
end