我的rails应用程序中有一个数据模型,许多用户可以注册该站点(由设计管理)并“订阅”选择(许多)小部件。我们的想法是他们只能看到他们订阅的小部件,我需要一些独特的方法来识别用户 - 小部件组合。然后我可以在cancan中定义能力。我有以下代码:
模型:
class User < ActiveRecord::Base
has_many :subscriptions
has_many :widgets, through: :subscriptions
end
class Widget < ActiveRecord::Base
has_many :subscriptions
has_many :users, through: :subscriptions
end
class Subscription < ActiveRecord::Base
belongs_to :user
belongs_to :widget
# some sort of unique DB index
validates_uniqueness_of :user_id, scope: :widget_id
end
然后这个ability.rb:
can :read, Widget do |widget|
widget.subscriptions.where(user: user).any?
end
如何定义此唯一标识符,以便cancan
?