用于访问对象特定字段的 Ruby 模式

问题描述 投票:0回答:1

我正在用 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))

但这似乎有点笨拙且难以扩展。你能建议一个更好的出路吗? 谢谢你的帮助

ruby-on-rails oop
1个回答
0
投票

您的解决方案可能很好并且具有规模,但其他程序员之前也考虑过同样的问题,并且您可以使用一些经过良好测试并不断维护的工具。

为此,我建议您研究一下策略对象模式,它的使用方式如下:

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,您可以在策略中定义一个范围来控制从数据库中选择哪些字段。

© www.soinside.com 2019 - 2024. All rights reserved.