在 Rails 中子类化 User 模型真的很糟糕吗?

2023-11-24

我受到 Rails 的强烈反对,因为我已将 User 子类分为许多不同的子类。在我的应用程序中,并非所有用户都是平等的。实际上有很多模型对象,并不是每个用户类型都可以访问它们。

我还需要一种方法来进行多态行为。例如,许多方法的行为会根据类型而有所不同。这不正是多态性的目的吗?

但问题是,我总是受到 Rails 的阻碍。默认值 - 特别是表单提交参数哈希的方式 - 似乎像非子类化模型一样工作。链接和参数哈希只是默认值真正困扰您的两种方式。

在 Rails 中处理不同类型用户的复杂逻辑的“正确”方法是什么?在 Java 中,子类化模型是有效的——您不必费尽心思让它按照您想要的方式工作。但在 Rails 中,很难让子类与 REST 约定一起工作,当你忘记包含时,它会惩罚你:as => :user,或者当您将子类对象放入链接时它会惩罚您,例如edit_user_path(@user)

还有另外一个领域也很难处理。假设我有一个Company模型,它有很多Users。这些用户可以是主管、讲师、实习生等——所有不同的子类。

当我们创建帐户时,我们可能想要使用accepts_nested_attributes_for :users。但是,如果我们使用它,我们就无法指定它创建的类。该死的!

看起来 Rails 中的所有内容都是为了不希望您对模型进行子类化而设计的。如果你不子类化,一切都会“正常”。但如果你继承了子类,你就会陷入地狱。

解决办法是什么?


一般来说,Ruby 中不鼓励继承,而支持混入行为和委托。 Ruby 和 Rails 可以做到这一点,但它往往会导致你提到的推回

您的特定示例听起来像是委托的情况:有一个属于员工的 User 类(反之亦然)。该员工(例如主管、讲师等)的特定类型行为都属于该特定员工类别。然后用户将如何处理特定场景委托给与其加入的员工

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Rails 中子类化 User 模型真的很糟糕吗? 的相关文章

随机推荐

  • 为什么 [01-12] 范围没有按预期工作?

    我正在尝试使用范围模式 01 12 在正则表达式中匹配两位数字 mm 但这并不按预期工作 您似乎误解了正则表达式中字符类定义的工作原理 匹配任何字符串01 02 03 04 05 06 07 08 09 10 11 or 12 这样的事情有
  • Angular 5 拦截器不会拦截从库发出的请求

    我在 Angular 5 中有一个有效的拦截器 它在 App module 的提供程序中注册 并正确拦截从应用程序发出的所有请求 问题是它不会拦截应用程序使用的库发出的请求 我正在使用一个开源库 NGX Jsonapi 并且需要拦截器在该库
  • Android 软键盘在全屏时隐藏来自 CordovaWebView 的输入

    我有一个 CordovaWebView 它呈现一些 html 表单 当我关注输入字段时 Android 的软键盘会弹出 对于某些字段 根据它们的位置 它会位于其顶部 基本上 它不会调整 CordovaWebView 的布局大小 无论我做什么
  • @OrderBy 导致 java.lang.ClassCastException:antlr.CommonToken 无法转换为 antlr.Token [重复]

    这个问题在这里已经有答案了 我正在尝试使用 OrderBy运行在 Spring MVC 项目上的注释JBoss EAP 6 1 server 我有 2 个项目 第一个项目名为model gen wifipnsd并且它只包含模型类由第二个项目
  • webdriver:获取元素的xpath?

    是否可以返回 WebElement 的 xpath 不是直接来自 WebDriver 但如果您确实需要 您可以伪造它 public String getElementXPath WebDriver driver WebElement ele
  • 在数组上使用 OR 逻辑作为 Sumproduct 中的参数

    我有一个相当大的数据集 我需要将多个条目组合成一个值 我的数据集包含两个数据集组合的数据 每个数据集都使用自己的 ID 和密钥 我想用一个Sumproduct 像这样的函数 SUMPRODUCT Raw data C C Landgebru
  • Spring Boot 应用程序不提供静态内容

    我正在使用 Spring Boot 并试图在部署时使我的静态资源 CSS JS 字体 可用 源代码可供您查看或克隆https github com joecracko StaticResourceError 现在 我部署的网站看不到我的 C
  • 在命令行上运行 XQuery

    听起来我需要某种类型的 XML 处理器 看起来有一个名为 Saxon 的程序 我可以用它来运行 XQuery 当我尝试时这个网站我得到的例子 Error Could not find or load main class net sf sa
  • 使用的变量定义是否经过优化?

    考虑以下方法 private static long maskAndNegate long l int numberOfLeadingZeros Long numberOfLeadingZeros l long mask CustomBit
  • Flutter:无法在onBackgroundMessage中使用任何插件

    我正在使用 Firebase 推送通知 并且想在触发 onBackgroundMessage 时执行一些代码 它实际上被触发是因为我在控制台中打印 但我尝试使用几个插件但没有成功 每次都会出现类似的错误 未处理的异常 MissingPlug
  • ITextSharp - 将两个 pdf 合并到一个页面中

    我将简单地阐述这个问题 我有这个pdf abcd 和这个 1234 4567 我想将它们合并以获得 abcd 1234 4567 可以使用 iTextSharp 或任何其他免费工具吗 提前致谢 这是一个老问题 但是如果有人再次进入这里我的解
  • 将可空类型序列化为可选的不可空元素

    我有一个带有可选元素的 xsd 架构 minOccurs 0 maxOccurs 1 类型int 该元素未定义为可为空 在数据模型中 我想将其映射到 net 类型的字段Nullable
  • System.out.printLn() 如何接受整数?

    于是前几天开始学习java 遇到一个问题 对于下一个表达式 String foo 123 不允许 然而 在System out printIn 我们可以使用类似的东西 int x 5 System out println x 既然不允许将整
  • 如何在Android中限制Spinner下拉视图的高度

    请建议我用来创建它的任何方法 Query 我正在创建 2 Spinner 视图 我必须在其中添加国家 城市列表 所以就像如果我选择印度 那么我会在下拉视图中看到 50 个项目 问题是它占用了整个页面高度 我想要的是 我想创建一个下拉视图 用
  • 如何在支持暂停/恢复的情况下上传到 S3?

    我想知道如何通过 暂停和恢复 支持将文件上传到 Amazon S3 通过网络浏览器 有可用的示例 Web 应用程序吗 任何编程语言 框架都可以 提前致谢 SOLUTION 我实现了以下应用程序 GitHub 链接 它基于示例应用程序和 ge
  • 如何截断外键约束表?

    为什么没有TRUNCATE on mygroup工作 尽管我有ON DELETE CASCADE SET I get 错误 1701 42000 无法截断外键约束中引用的表 mytest instance 约束instance ibfk 1
  • jquery:如果语句在ajax成功函数中不起作用

    我的 AJAX 中有一个成功函数 它从 python 脚本返回响应文本 可以是 SUCCESS 或 EMPTY 现在我想在 success 函数中放置一个 if 循环 但 if 循环不起作用 我从 python 脚本中获取了正确的数据 因为
  • 如何在企业代理后面配置 Nginx

    是否有与 Apache 相当的工具ProxyRemoteNginX 的指令 所以场景是我在一个公司代理后面 我想使用 NginX 为各种服务做代理通行证 我会在 Apache 中执行以下操作 ProxyPass localStackOver
  • CSS:创建凸起框效果的好方法是什么?

    也就是说 元素的左边框和下边框需要提供弹出的 3D 效果 有没有一种好的 纯 CSS 的方法来实现这种效果 foo border 8px outset 999 webkit box shadow 5px 5px 15px rgba 0 0
  • 在 Rails 中子类化 User 模型真的很糟糕吗?

    我受到 Rails 的强烈反对 因为我已将 User 子类分为许多不同的子类 在我的应用程序中 并非所有用户都是平等的 实际上有很多模型对象 并不是每个用户类型都可以访问它们 我还需要一种方法来进行多态行为 例如 许多方法的行为会根据类型而