问题标签 [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 投票
2 回答
1728 浏览

ruby-on-rails - Rails STI 更改类型

我目前正在从事一个项目,我正在使用 STI 模型并希望将一个记录转换为另一种类型而不创建新记录。有些观察者会在创建新模型时触发,但是我不希望这些观察者触发并希望保持相同的 ID。有没有一种简单的方法可以通过 ORM 将记录从一个模型转换为另一个模型?,而不使用 SQL?

干杯

0 投票
1 回答
207 浏览

ruby-on-rails - Rails 设计模式:大量子模型覆盖特定功能

我有一个模型,它会被调用大约 50 次来创建 50 个带有 rake 任务的文件。

大约 90% 的代码可以重用,但我需要重写一些方法。我正在考虑只是从原始表继承,但这可能会导致大约 40-50 个模型,这感觉不对:

我可能需要在每个模型中覆盖大约 3-4 种方法。

我的另一个想法是使用这篇文章中的 MODULE + EXTEND + SUPER DECORATOR:http ://robots.thoughtbot.com/post/14825364877/evaluating-alternative-decorator-implementations-in Ie

然后拥有 50 个模块并在创建时扩展适当的模块。

那么哪个是最好的选择,或者这种情况有更好的模式吗?

0 投票
2 回答
2968 浏览

ruby-on-rails-3 - Rails 3.2 如何只为新记录调用 before_validation

Rails 3.xbefore_validation(:on => :create) do不工作。任何其他想法表示赞赏

0 投票
4 回答
9734 浏览

sql - Rails STI 与子类的关联

在使用 STI 时,从与 rails 3 的 has_many 关联中获取集合时,我遇到了一些奇怪的行为。我有:

期望的行为是branch.employees返回所有员工,包括分支管理员。分支管理员似乎仅在被 访问时才在此集合下“加载” branch.admins,这是控制台的输出:

这可以在生成的 SQL 中看到,第一次:

第二次:

我可以通过指定来解决这个问题:

因为它们都是从它们的 branch_id 中找到的,但是如果我想这样做,这会在控制器中产生问题,branch.employees.build那么该类将默认为User,我必须在某处修改类型列。我现在已经解决了这个问题:

但如果可能的话,我真的很想避免这种情况。任何人,任何想法?

编辑:

finder_sql 和 counter_sql 并没有真正为我解决这个问题,因为似乎父关联不使用它,所以organisation.employeeshas_many :employees, through: :branches将再次只包括User::Employee选择中的类。

0 投票
4 回答
2406 浏览

ruby-on-rails - Rails 雇主和雇员设计

我试图弄清楚如何构建这个请帮助:我需要用户能够注册为雇主或雇员。雇主基本上是公司,雇员是从事该工作的人。我想知道如何记录员工何时/是否被雇用和终止工作。协会会has_many:through为此工作还是更好,但是否有一个我忽略的宝石可以帮助我解决这个问题?

0 投票
1 回答
352 浏览

ruby-on-rails-3 - Rails 3 destroy oldest item in database if user owns more than 10

I have an Activity stream I have designed using STI in rails 3.

I want to do a check to see if a user has more than 10 activity items on create. When a user creates his 11th Activity in the database, I want it to destroy the oldest record * essentially the first record the user made and so on.* This way I am keeping my database clean of thousands of old useless records.

I am assuming I would start at the model level, but since I dont want to define the "current_user" in the model, it should be in the controller.

Any help would be appreciated to accomplish this task, I am fairly new at these type of more advanced tasks in rails.

0 投票
1 回答
1693 浏览

ruby-on-rails - 具有多态关联的 Rails STI 模型,急切加载查询引用了错误的类类型

我在这里使用的是 Rails 2.3.14,但我遇到的问题可能并不局限于这个特定版本。这是 Rails 3 中仍然存在的所有关联和急切加载功能,并且在 2.3.14 之前就已经存在。我正在从 rails 2.3.8 升级,我没有遇到下面描述的问题。

下面的代码是基于更复杂的生产系统的模型。我概述的类/模块方案是这样设置的,这是有原因的。实际上,我在这个模型中包含了比演示问题所需的更多细节,希望使系统的整体结构更加清晰。

假设我有几个可以“驱动”的域对象,包括车辆(汽车/卡车)和高尔夫球。对于其中的每一件事,我都有一个 ActiveRecord 类:

首先注意GolfBall是一个顶层模型类,对应的数据库表是golf_balls. 另一方面,CarTruck是 的子类Vehicle。车辆数据库是使用 STI 设置的,因此Cars两者Trucks都对应于vehicles表(带有type列微分器)。

其次,请注意,我Drivable在所有底层域对象(Car, Truck, GolfBall)上都包含了一个模块,它看起来像这样(在实际系统中,这个模块也做了很多事情,包括根据特定的设置进行设置,包括域对象):

所以这些东西中的每一个都可以有一个Driver,并且它使用:class_name基于包含类名称的 a(例如,在一个with中包含类Car结果),因为这些引用的类中的每一个(等等......)都包含特定的业务逻辑,这是必要的协会的用途。has_one:class_name => "CarDriver"CarDriver

有一个建立多态关联的顶级Driver类,然后是与上述域对象驱动程序类似的子类层次结构:

这是基于单个数据库表drivers,对所有子类使用 STI。

有了这个系统,我创建了一个新的Car(存储在@car下面)并将它与这样的新创建的相关联CarDriver(在这个模型中它被分成这些特定的顺序步骤,以反映实际系统的工作方式):

这在表中创建了数据库行,vehicles如下所示:

表格中的一行是drivers这样的:

Vehicledriveable_type相反的,Car因为车辆是 STI。到现在为止还挺好。现在我打开一个 Rails 控制台并执行一个简单的命令来获取一个Car实例:

根据日志,这是执行的查询:

然后我得到CarDriver

这导致该查询被执行。

但是,如果我尝试使用急切加载,我会得到不同的结果。从新的控制台会话中,我运行:

这导致nil了司机。检查日志,第一条语句执行以下查询(常规查询和预加载查询):

如您所见,在急切加载的情况下,Car查询与上述相同,但CarDriver查询不同。它几乎是相同的,除了drivers.driveable类型它正在寻找Car它应该寻找 STI 基类名称的位置Vehicle,就像它在非急切加载情况下所做的那样。

知道如何解决这个问题吗?

0 投票
2 回答
1434 浏览

ruby-on-rails - ActiveRecord 通过针对 STI 类的范围构建错误类的实例

我希望能够build通过其 STI 类型在以特定模型类为目标的范围上调用该方法,并让 ActiveRecord 构建正确类的实例。

在这里,我期望的是 的实例DiscountLineItem,而不是 的实例LineItem

0 投票
1 回答
958 浏览

ruby-on-rails - 使用单表继承阻止 rails 将类型包含在 belongs_to 中

我有一个问题,rails 向我的 belongs_to 关联添加了不必要的(我认为)子句 - 即使我的关联使用外键,也会限制类型。

STI 设置如下所示:

所以Foo有一apple_id列链接到 中的主键列 ID fruits,并且Apple是 STI 下Fruit。我对这一切感到满意。

现在:

为什么要添加 rails AND "fruits"."type" IN ('Apple')?它是使用表的主键的 belongs_to fruits,因此类型部分似乎是多余的。我可以阻止rails将该部分添加到查找中并得到这个:

我知道我可以belongs_to :apple, :class_name => "Fruit"在 Foo 中做,但我希望对象在返回时自动变为Apples。

万一有人质疑我的动机......我想这样做是因为 type 子句弄乱了 postgres 在我fruits对其他表进行查询时选择的查询计划(是的,我有一个索引type,甚至尝试了一个 multi -第一栏[type,id])。在这里完全描述有点复杂/无关紧要。

0 投票
1 回答
191 浏览

mysql - STI MySQL fun select 与 case

我有以下 STI 设置:

我想在返回以下结构的 Animals 表上进行选择:

理想情况下,我想要这样的东西:

但这不起作用,所以我这样做了:

有没有办法使第一个查询工作,如果没有,是否有更好/替代的方法来编写第二个查询?