Rails 3,CANCAN以限制基于用户的InstanceID在整个应用程序中的所有查询结果
-
01-10-2019 - |
题
我有两个桌子用户(名称,电子邮件,密码,instance_id等...)示例:詹姆斯·邦德,james@abc.com,1个实例(id,域)示例:1,abc.com
通过申请,我要确保James Bond仅看到分配给他的实例= 1的数据
因此,如果我有一个带有(名称,desc,instance_id)的书籍表,他只会看到他的实例书籍。
有人告诉我,坎卡(Cancan)是这样做的方法级别低于上述数据规则。
想法?
解决方案
您可以尝试使用示波器,例如:
class Books < ActiveRecord::Base
# .... code ....
scope :personal, proc {|user| where(:instance_id => user.instance_id) }
# .... code ...
end
现在您可以做:
@personal_books = Books.personal(@user)
您可以在此处阅读有关范围的更多信息: http://www.railsdispatch.com/posts/rails-3-makes-life-better (向下滚动一点)
另一种方法是建立像
用户has_many图书通过实例
然后,您将有一个额外的旧表映射用户来通过其实例进行书籍。这是一个N:M的关系。因此,一本书可能属于多个实例。
看起来像这样:
用户表:
用户(名称,电子邮件,密码,实例_ID等...)
书籍表:
书籍(名称,desc)#NO MORE INSPENS_ID!
映射表:
作业(instance_id,book_id)
您的模型看起来像:
class Assignment < ActiveRecord::Base
belongs_to :book # foreign key - book_id
belongs_to :instance # foreign key - instance_id
end
class Instance < ActiveRecord::Base
has_many :assignments
has_many :books, :through => :assignments
end
class Books < ActiveRecord::Base
has_many :assignments
has_many :users, :through => :assignments
end
class User < ActiveRecord::Base
belongs_to :instance
end
获取用户实例所有书籍的代码看起来像:
@user = User.find(:first)
@books = @user.instance.books.find(:all)
(我建议您阅读 http://api.rubyonrails.org/classes/activerecord/associations/classmethods.html )
编辑
如果一本书总是属于一个实例,则可以尝试一下:
class User < ActiveRecord::Base
belongs_to :instance
end
class Instance < ActiveRecord::Base
has_many :users
has_many :books
end
class Books < ActiveRecord::Base
belongs_to :instance
end
因此,您可以拿出一个用户的书:
@user.instance.books.find(:all)
不隶属于 StackOverflow