我正在用 ruby 进行编码,想询问可能的模式(或者甚至是 gem)
我的问题是我有两节课
class Review < ApplicationRecord
class User < ApplicationRecord
我希望能够以用户(特定类型)只能访问某些字段的方式映射审阅字段。
首先想到的是有一个
global
get 方法,类似于
def self.fields_for(user:)
if user.admin?
[:name, :created_by].join(",")
else
...
end
end
然后
Review.where(...).pluck(Review.fields_for(user: user))
但这似乎有点笨拙且难以扩展。你能建议一个更好的出路吗? 谢谢你的帮助
您的解决方案可能很好并且具有规模,但其他程序员之前也考虑过同样的问题,并且您可以使用一些经过良好测试并不断维护的工具。
为此,我建议您研究一下策略对象模式,它的使用方式如下:
class ReviewPolicy
attr_reader :user, :fields
def initialize(user)
@user = user
@fields = determine_fields
end
private
def determine_fields
if user.admin?
[:name, :created_by]
else
# Other fields for different roles
end
end
end
# Usage
policy = ReviewPolicy.new(user)
Review.select(*policy.fields).where(...)
或者由 Pundit Gem 描述为:
班级复习政策< ApplicationPolicy class Scope < Scope def resolve if user.admin? scope.all.select(:name, :created_by) else # Different scope for other users end end end end
使用 Pundit,您可以在策略中定义一个范围来控制从数据库中选择哪些字段。