问题标签 [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 回答
640 浏览

ruby-on-rails - 什么是创建 STI 模型实例的更好方法

通常人们会通过其父对象构建一个相关的模型实例:

但是当我们使用 STI 并且我们想要这样做的同时将其构建为子类之一时,语法似乎会崩溃。据我所知,这是最好的方法(忽略不根据批准列表检查类型的安全问题):

这是最好的方法吗?我使用单个控制器来构建所有不同的子类类型,所以我需要提供类型作为参数。

0 投票
2 回答
277 浏览

ruby-on-rails - 是否有一个 rails gem 可以为整个应用程序中的多个选择输入中的所有“选项”使用单个表?

因此,有时您只需要一个选项列表供您选择。是否有一个简单的 gem 可以很容易地使用一个表格来处理您在应用程序中可能拥有的所有类型的选项?

该表可能如下所示:

例如,国家列表、州列表、颜色列表、月份列表等......

然后在使用选择时:

然后它会使用来自某些选项表的值/标签的选项填充选择,其中行的类型为 :color。

这很容易自己滚动,但如果它已经建成,我不想花时间。

更新

我希望这是一个动态表,因此最终用户可以从选择选项表中添加/删除项目

0 投票
2 回答
1249 浏览

ruby-on-rails - RoR:STI / MTI / Mixin 混淆

我有一个问题,我认为这对大多数 RoR 开发人员来说是基本的。事实上,它更多的是关于“理解”而不是真正的编程(我已经编写了一些模块来扩展 ActiveRecord::Base 以允许轻松生成与 Ext-JS 相关的东西而没有任何问题)。

让我们举一个简单的例子,我将使用面向 ORM 的语言而不是数据库/模型语言。

  • 第三方是一个基本实体,有一个名为“标签”的通用成员。
  • 第三方实例可以是客户、供应商,或者两者都不是(因此客户/供应商就像具体的接口而不是继承的类)。
  • 客户和供应商都有专门的成员,它们中的大多数对于每个类都是唯一的(客户/供应商除了通过第三方绑定的标签字段外不共享太多数据)。

我试图做各种各样的事情:

  • 第三方 < ActiveRecord::Base
  • 客户 < 第三方
  • 供应商 < 第三方

[编辑] 在这里错过了我的解释。我的意思是:第三方的一个实例可以是客户、供应商、两者或无。正如第一个评论者指出的那样,我的例子可能不是最好的......您可以用“Character”替换“ThirdParty”,用“Archer”/“SwordsMan”替换“Customer”/“Supplier”。一个字符可以是一个、两个、两个或一个都没有,但会提供有关任何 Character 实例的信息。Archer / SwordsMan 上的 getter 应返回 Character 实例“实现”接口契约,而不是仅返回他们自己的实例,并在角色对象上使用“getter”。[/编辑]

我也试过:

  • 第三方 < ActiveRecord::Base (has_one Customer; has_one Supplier)
  • 客户 < ActiveRecord::Base (belongs_to ThirdParty)
  • 供应商 < ActiveRecord::Base (belongs_to ThirdParty)

但这对我来说似乎有点“丑陋”,因为我必须做 Customer.find(something).third_party.label 来访问我的“接口”“继承”的数据。

此外,我可以在我的第三方模型中包含一个 customer_id 和一个供应商 ID 字段,但它似乎也不正确,因为一个第三方可以是两者,或者它们都不是......

当然,我希望能够找到一个不妨碍/没有太多技巧的解决方案,例如让我可以为另一个模型做一些多态关联(例如可寻址或可评论,可接触等...)

我也一直在阅读很多关于这个主题的文章,比如在这样的博客上:http: //mediumexposure.com/multiple-table-inheritance-active-record/ ...但我迷失在正确的方式上(在我在该主题上找到的大多数文档都不清楚是否适用于 Rails 1、2、3 ......最近在这个问题上实施了什么,等等)。

有人可以为我提供各种“最新”网站或适合我给出的示例的示例吗?

提前,我感谢大家提出我的问题,并最终向我解释在这个特定主题上使用的不同技术。

PS:如果您需要我解释更多我在寻找什么,我可以尝试......但请记住,我的英语在这个领域有点“有限”,因为我对 RoR 比较陌生。

0 投票
1 回答
350 浏览

ruby-on-rails - 尝试使用 gsub 更改属性的迁移问题

我有一张名为 items 的表。我想更改 9 个对象的描述属性(它是一个文本属性)。具体来说,这些对象是 Item 的子类——称为 Juice。所以项目表是 STI。这是该项目的示例描述:

将所有支出提高20%

现在,当我尝试运行以下迁移时,我无法更新该当的描述。有任何想法吗?(Rails 版本是 2.3.11。)

0 投票
1 回答
1019 浏览

ruby-on-rails - ActiveRecord 为 has_many 生成的错误 sql:通过与 STI 的关系

考虑这些模型:

换句话说,我们有一个 has_many :through 'tag-style' 关系,但是其中一个模型(第三个)是从另一个(第二个)继承的 STI。

假设我想做一个连接来查看所有第三个实例以获得第一的某些值:

这将按预期工作;生成的 sql(通过 to_sql)是:

这在另一个方向不起作用:

生成的 SQL 为:

这会导致标签重复,因为 :seconds 没有像上面的第一种情况那样与标签表正确连接(参见每种情况下的第三行 sql 语句)。所有带标签的第一个都将显示在结果表中,WHERE 子句完全无效。

如果需要指定其他内容,我还没有遇到过。如果有人知道如何强制它工作,请告诉我。否则,我假设这是 Rails 中的一个错误。哦,请不要建议我使用将被弃用的旧 model.find() 方法。

更新:

https://rails.lighthouseapp.com/projects/8994-ruby-on-rails/tickets/6608-generated-sql-for-has_many-through-relation-wrong-when-used-with-sti

因此,根据确认这是一个错误的人所说,“如果你在基类中定义关联,它会按预期工作。” 有谁知道这意味着什么/如何做到这一点?

0 投票
2 回答
1500 浏览

ruby-on-rails - 当它的超类是抽象的时,为什么 Rails 不尊重与 STI 关联的 belongs_to 关联对象的类型?

我在我正在开发的 Rails 应用程序中遇到了这种相当奇怪的行为。

我在继承层次结构中有多种类型的 Post,并且 Post has_many FeedEntries。

现在,当我像以前一样设置好所有东西时,对保存的对象调用 FeedEntry#post 总是返回一个正确(子类)类型的对象,正如我所期望的那样。但是,如果我使 Post 抽象(它确实应该是 - 超类永远不应该在此模型中实例化):

_(注意:我编辑了此代码片段以考虑到以下 tomafro 的建议,因为设置 self.abstract_class 似乎比覆盖 self.abstract_class 更惯用?但是,同样的行为仍然存在。)

...然后在以前保存的对象上调用 FeedEntry#post 关联会返回 Post 类型的对象。这似乎相当倒退(鉴于抽象类声明明确表示不应实例化该类),我想不出这种行为的原因。

那么,我没有得到什么原因,或者它是一个错误,还是其他什么?

0 投票
1 回答
335 浏览

ruby-on-rails - Rails - 申请人/员工关系的单表继承与否

我正在开发一个招聘应用程序,用于存储来面试的人的记录。所以我有两个模型——申请人和员工,这在 OO 意义上看起来像是一个。ie Employee 之前是申请人。因此,我打算创建一个单表继承,例如:

申请人 < 人

员工 < 人

申请人的所有字段都在员工中。员工还有其他几个不在申请人中的字段。

我对这个计划是否正确。我还有另一个类似的情况要处理 - 潜在客户和客户。

更新:随着我越来越多地使用 STI,我开始不喜欢它。

0 投票
2 回答
3912 浏览

ruby - Ruby on Rails 3.0 中的单表继承和路由

在我的 Ruby on Rails 应用程序中,让路由与单表继承很好地配合使用时遇到了一些麻烦。我正在使用 Ruby 1.9.2 和 Rails 3.0.6。这是在开发中,所以后端是 SQLite3,以防万一。

假设我有两种产品,widgets并且sprockets. 我的应用程序会跟踪这两种产品的错误编号和支持案例票,但错误和支持票本身存储在其他系统中。有两个独立的团队负责这两种产品。

我已经为这两种类型的错误记录实现了单表继承,因为小部件错误编号和 sprockets 错误编号的验证规则不同(两个团队使用不同的错误跟踪系统)并且有可能我必须添加更多产品到行为完全不同的应用程序。使用 STI 使我能够根据需要灵活地实现其他方法和属性。

小部件团队只关心小部件信息,链轮团队只关心链轮信息。第三个团队需要能够查看小部件和链轮的信息。小部件团队将使用路径访问应用程序/widgets,而 sprockets 团队将使用路径访问应用程序/sprockets。我在routes.rb使用命名空间中进行了设置:

我已经设置了以下模型,当我启动 irb 并使用WidgetBug.create()or时,它们会按预期工作SprocketBug.create()

错误.rb

widget_bug.rb

sprocket_bug.rb

我使用脚手架为错误对象创建控制器和视图,然后修改控制器以尝试对其进行概括,以便它可以用于小部件错误和 sprockets 错误。例如,该index方法如下所示:

然后我用create()每种类型的几个错误填充数据库。不幸的是,当我浏览到 时/widgets/bugs,两种产品的错误都出现了。经过一些调试,我确定分类调用正在返回Widgets::Bugsor Sprockets::Bugs,所以当我调用它时,它似乎是针对超类运行而不是针对子类运行。

我已经查看了路由文档并在 Google 上进行了大量搜索,但我仍然不知道如何更改路由或控制器以使其正常工作。任何帮助将不胜感激。

0 投票
2 回答
1091 浏览

ruby-on-rails - STI + 命名空间

我需要能够为用户安排提醒。所以我想我可以创建一个基本模型Reminder并使用 STI 来创建覆盖函数的后代类fire(),在提醒触发时调用。但是不同的用户角色有类似的提醒类型。所以他们需要命名空间,例如Adult::BrushTeethReminder向用户发送电子邮件,Kid::BrushTeethReminder在孩子的 FB 墙上发帖。

STI 有可能吗?如果有,怎么办?我看到的其他方式是只为模型名称添加前缀,例如KidBrushTeethReminder. 或者更深入——编写一个根据类型创建对象的工厂方法。还是有更清洁的方法?

0 投票
1 回答
126 浏览

mysql - 返回涉及 STI 和子类亲子关系的记录结果

忍受我一秒钟...

我有两个模型:HorseRaceEvent 和 Wagerable。

Wagerable 使用具有两个子类的 STI:Trifecta 和 Wager。

Trifecta 和 Wager 之间存在亲子关系。对于 Trifecta,有 3 个与之相关的投注。为了在 Wager 与其父 Trifecta 之间建立关联,我为 Wager 记录使用了 parent_id 列,该列引用了 Trifecta 记录。如果投注不是 Trifecta 的一部分,则 parent_id 为空。(Trifecta 的 parent_id 始终为空。)

所以:

  • Trifecta 有很多赌注
  • 赌注属于 Trifecta

现在输入 HorseRaceEvent。

  • HorseRaceEvent 有很多赌注。
  • 赌注属于 HorseRaceEvent。

注意:请注意,与 HorseRaceEvent 的关系是 Wager,而不是 Wagerable 或 Trifecta。(对于 Trifecta 记录, horse_race_event_id 始终为空。)

HorseRaceEvent 有一个称为“状态”的属性,它可以具有三种状态:未开始、开始、最终。

Wagerable 有一个名为“结果”的属性,该属性具有以下三个值之一:null、W、L。

这是挑战:

对于 Trifecta 模型,我想实现一个 named_scope 或静态方法,它返回所有 Trifecta,其中 (1) 结果为 null 并且 (2) 其子 Wager 的关联 HorseRaceEvent 中的每一个都是“Final”。