问题标签 [sti]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
151 浏览

ruby-on-rails - Rails:单表是解决这个问题的一个好的设计选择吗?

我最近刚刚继承了一个 Rails 应用程序,并且正在讨论向前推进的架构决策。这里有一些背景......感谢您的反馈。

目前有 16 种不同的广告类型,它们都具有一组相同的属性,一些具有一个或两个附加属性,还有一些具有三个或四个属性。

目前,每种广告类型都有一个单独的模型和带有相应列的表格,以及一个单独的控制器和 CMS 中的视图,也用于基本的 CRUD。CMS 利用了inherited_resources,从而限制了一些重复。

我写出了属性集——大约有 20 个,涵盖了所有广告类型。某些广告类型具有关联 - 几个 has_many 关联,其中外键存储在关联表中,还有一些属于_to。

广告没有实际行为。特定的广告类型只是简单地显示在各个页面上,所以只要我能确定是否有特定类型的广告,我们就可以了。

我正在讨论转向单个模型、表和控制器,但希望从 stackoverflow 社区获得尽可能多的输入,以了解这是否 1)非常适合问题 2)任何性能问题 3)任何潜力我没有想到的编程瓶颈。到目前为止,这是我的想法......


假设路线 /:location/:ad_type/new(例如 /homepage/ad_type_1/new):

ad_controller 将创建 @ad 并将 ad_type 设置为 params[:location] + params[:ad_type] 并渲染新视图,该视图将包含一系列条件,用于显示给定 ad_type 的适当部分。提交将触发创建操作,使用为广告类型定义的预期属性创建广告,在这种情况下,其中之一是 ad_type = homepage_ad_type_1。

我没有过多考虑检索数据,但假设 ad_type 列设置正确,我应该能够创建一个基于 ad_type 列提取记录的“of_type”范围。不确定我是否在那里遗漏了什么。

验证将根据 ad_type 值而有所不同。

我不完全确定在任何给定时间会存在多少广告,但我觉得这可以在以后解决。通过将一些陈旧的行移到 ad_archives 表或类似的表中。

感谢您的想法。谢谢。

0 投票
1 回答
734 浏览

ruby-on-rails - 来自基类的 Rails STI 条件子类化

我正在开发一个项目,我有一个实体,它可能有两种资产:基本上是图片视频

由于我希望所有资产都在同一张表上,并且为PicturesVideos提供一个上传表单,因此我使用的是 Single Table Inheritance,其中PictureVideo都从Asset类下降。此外,我将运行不同的验证/回调,具体取决于它是视频还是图片。

我正在使用回形针来处理上传过程,我的想法是在上传文件并使用它创建资产时,应用程序将根据上传文件的 mime 类型实例化正确的子类( PictureVideo ) .

这是我的课程的草图:

我的想法是在Asset类上实现before_save回调并尝试在那里实例化正确的类,但我不知道该怎么做或者这是否是个好主意。

对此有任何想法吗?

0 投票
1 回答
688 浏览

routing - rails 3 问题的 sti 和 form

这类似于 STI 和 form_for 问题,但那里给出的答案与 rails 3 不兼容,并给出了弃用警告。但是,如果我尝试使用新语法,我会得到一个非常混乱的结果。这就是问题所在。

event_enquiry 是一种查询,在旧语法中我会这样做

这会生成预期的路径 /event_enquiries/1/build_provider_versions 并在日志中我看到 Started POST "/event_enquiries/1/build_provider_versions" for 127.0.0.1 at 2010-12-22 22:00:11 +0000

但这给出了弃用警告

但是虽然新的语法

似乎生成了相同的路由,并且在日志中我得到完全相同的消息 Started POST "/event_enquiries/1/build_provider_versions" for 127.0.0.1 at 2010-12-22 22:01:58 +0000 该路由显然不存在!

ActionController::RoutingError(没有路由匹配“/event_enquiries/1/build_provider_versions”):

我来来回回地经历了这个,看不到发生了什么。有谁知道发生了什么?

显然,我现在很高兴回到旧语法,但我有一种讨厌的感觉,这里有些东西坏了……还是我只是愚蠢?

0 投票
2 回答
927 浏览

model - 如何在 Rails 中为“约会”建模?

这是我面临的情况:

可以安排约会:

  1. 今天
  2. 一周中的某个时间
  3. 在特定日期

因此,每个约会“类型”的属性可能不同。

我正在考虑这些模型并将其与 STI 一起使用,但我不确定我是否走在正确的轨道上:

桌子:

对此进行建模的最佳方法是什么?

这是单表继承的好选择吗?

更新

感谢@Mike,@SpyrosP 到目前为止的帮助。我想出了下面的选项。

这些是数据库表的“视图”以及它们的外观。

哪一个看起来最合适?

0 投票
1 回答
1276 浏览

ruby-on-rails - Rails STI 验证继承

我的 Rails 应用程序中有 STI 模型。祖先模型对validates_...运行良好的方法进行了验证。

但我也有自定义验证,我想在后代中添加更多不同的自定义验证。这些自定义验证将取决于类。

如果我写

它只是覆盖了原始验证,因此我放弃了原始继承的验证。

在 Rails 中有这样的约定吗?

0 投票
2 回答
5012 浏览

ruby-on-rails - Rails STI 和“类型”字符串的设置

我想我需要在 Rails 中使用 STI。

这是我的课:

people 表有一:type列是字符串。

所以,我期望在表中看到的是,作为 Person 的每一行的类型都设置为“Person”,每个 Landlord 的类型都设置为“Landlord”。然而,这不是我所看到的。每个 Landlord 的类型设置为“Landlord”,但所有 Person 的类型都设置为 nil。这很可能是 rails 的工作方式,但我只是在寻找一些确认。

0 投票
2 回答
1207 浏览

ruby-on-rails - Rails:使用类方法返回有关子类的属性时,为什么不加载子类?

您好,我一直在寻找解决此问题的方法。使用 Rails 2.3.5

我有一个包含几个子类的父类,为了没有一个 1500 行长的文件,我将子类保存在 app/models 目录的子目录中。

直到最近,当我查看这篇文章时:这里

我什至无法加载子类

现在我想使用 self.inherited 类方法访问每个孩子,如下所示:

暂时,我放了一些调试语句来更好地了解事物是如何加载的。我启动了控制台并注意到了这种行为:

我确信对此没有那么优雅的解决方案,例如将子类全部放回一个巨大的文件中,但如果可能的话,我想避免这种情况。

谢谢

0 投票
3 回答
3769 浏览

ruby-on-rails - STI 和扩展子类以在数据库中包含“额外”列?

也许 STI 不是我想要的,我愿意接受所有建议,但为了这个问题,让我们假设以下现实世界的情况:

您希望您的应用程序为不同的邮件供应商提供 API 数据。使用 STI,您有以下模型

现在让我们启动一些控制台操作:

好的,现在您要添加 API 密钥设置。MailChimp 只使用一个 api_key。Aweber 可以使用 api_key 和签名,而 Postageapp 使用 api_key 和令牌系统。

您会扩展每个子类以包含数据库中所需的任何列吗?你会一起废弃 STI 并让常规类说,MailChimp继承自 AR 吗?

我对 STI 的理由是我知道我的所有用户都会有一个 MailSetting,它是随着时间的推移可能会扩展的类型。但是,我发现以这种方式扩展这些子类很痛苦,因为你不能在user.mail_setting.connect不知道它们来自哪个子类的情况下做一些事情,然后,我需要什么来连接这些人?

想法?

0 投票
2 回答
1540 浏览

mysql - MySQL 复合索引中键的高性能排序(WRT Rails 多态关联和 STI)

以前,我问过这个关于 ActiveRecord 中多态外键的复合索引的问题。我的问题的基础是我理解索引应该基于列的基数,并且 Rails 的 STI 类型和多态 _type 列的基数通常很低。

接受我的问题的答案是正确的——这就是索引高基数 _id 列和低基数 _type 列的价值,因为它们在一起具有高基数——我的下一个问题是:你应该如何订购你的化合物索引?

[owner_id, owner_type] 的索引将具有较高基数的字段放在第一位,而 [owner_type, owner_id] 将具有较高基数的字段放在第二位。使用前一个键的查询比使用后一个键的查询性能更高,还是它们的性能相同?

我问是因为这与我如何为服务 STI 模型的表订购复合键有特殊关系。STI Rails 查找器几乎总是在类型列上进行查询——这又是一个通常低基数的列。因此,类型列的查询比其他索引更频繁。如果更频繁地查询类型列,那么使用类型前导索引可能是有意义的,因为不太具体的查询可以利用索引的第一部分来提高性能。但是,我不会因为不利于高度特定查询的性能而降低福利。利用索引的较高基数部分。

0 投票
3 回答
10585 浏览

ruby-on-rails - 多表继承与 rails 3

关于 Rails 3 中的多表继承,是否有标准或最佳实践?到目前为止,我能找到的最好的文章是:

http://mediumexposure.com/multiple-table-inheritance-active-record/

但即使这样也需要一些更改(例如,将需求移动到初始化程序而不是旧的 /config/environment.rb)

有更好的资源/标准吗?