我需要根据访问控制规则为范围查找找到一个优雅的解决方案。基本上我有以下设置:
用户 顾客 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))
答案 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