问题标签 [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.
ruby-on-rails - Rails STI 更改类型
我目前正在从事一个项目,我正在使用 STI 模型并希望将一个记录转换为另一种类型而不创建新记录。有些观察者会在创建新模型时触发,但是我不希望这些观察者触发并希望保持相同的 ID。有没有一种简单的方法可以通过 ORM 将记录从一个模型转换为另一个模型?,而不使用 SQL?
干杯
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 个模块并在创建时扩展适当的模块。
那么哪个是最好的选择,或者这种情况有更好的模式吗?
ruby-on-rails-3 - Rails 3.2 如何只为新记录调用 before_validation
Rails 3.xbefore_validation(:on => :create) do
不工作。任何其他想法表示赞赏
sql - Rails STI 与子类的关联
在使用 STI 时,从与 rails 3 的 has_many 关联中获取集合时,我遇到了一些奇怪的行为。我有:
期望的行为是branch.employees
返回所有员工,包括分支管理员。分支管理员似乎仅在被 访问时才在此集合下“加载” branch.admins
,这是控制台的输出:
这可以在生成的 SQL 中看到,第一次:
第二次:
我可以通过指定来解决这个问题:
因为它们都是从它们的 branch_id 中找到的,但是如果我想这样做,这会在控制器中产生问题,branch.employees.build
那么该类将默认为User
,我必须在某处修改类型列。我现在已经解决了这个问题:
但如果可能的话,我真的很想避免这种情况。任何人,任何想法?
编辑:
finder_sql 和 counter_sql 并没有真正为我解决这个问题,因为似乎父关联不使用它,所以organisation.employees
这has_many :employees, through: :branches
将再次只包括User::Employee
选择中的类。
ruby-on-rails - Rails 雇主和雇员设计
我试图弄清楚如何构建这个请帮助:我需要用户能够注册为雇主或雇员。雇主基本上是公司,雇员是从事该工作的人。我想知道如何记录员工何时/是否被雇用和终止工作。协会会has_many:through
为此工作还是更好,但是否有一个我忽略的宝石可以帮助我解决这个问题?
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.
ruby-on-rails - 具有多态关联的 Rails STI 模型,急切加载查询引用了错误的类类型
我在这里使用的是 Rails 2.3.14,但我遇到的问题可能并不局限于这个特定版本。这是 Rails 3 中仍然存在的所有关联和急切加载功能,并且在 2.3.14 之前就已经存在。我正在从 rails 2.3.8 升级,我没有遇到下面描述的问题。
下面的代码是基于更复杂的生产系统的模型。我概述的类/模块方案是这样设置的,这是有原因的。实际上,我在这个模型中包含了比演示问题所需的更多细节,希望使系统的整体结构更加清晰。
假设我有几个可以“驱动”的域对象,包括车辆(汽车/卡车)和高尔夫球。对于其中的每一件事,我都有一个 ActiveRecord 类:
首先注意GolfBall
是一个顶层模型类,对应的数据库表是golf_balls
. 另一方面,Car
和Truck
是 的子类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
这样的:
Vehicle
是driveable_type
相反的,Car
因为车辆是 STI。到现在为止还挺好。现在我打开一个 Rails 控制台并执行一个简单的命令来获取一个Car
实例:
根据日志,这是执行的查询:
然后我得到CarDriver
:
这导致该查询被执行。
但是,如果我尝试使用急切加载,我会得到不同的结果。从新的控制台会话中,我运行:
这导致nil
了司机。检查日志,第一条语句执行以下查询(常规查询和预加载查询):
如您所见,在急切加载的情况下,Car
查询与上述相同,但CarDriver
查询不同。它几乎是相同的,除了drivers.driveable
类型它正在寻找Car
它应该寻找 STI 基类名称的位置Vehicle
,就像它在非急切加载情况下所做的那样。
知道如何解决这个问题吗?
ruby-on-rails - ActiveRecord 通过针对 STI 类的范围构建错误类的实例
我希望能够build
通过其 STI 类型在以特定模型类为目标的范围上调用该方法,并让 ActiveRecord 构建正确类的实例。
在这里,我期望的是 的实例DiscountLineItem
,而不是 的实例LineItem
。
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 中做,但我希望对象在返回时自动变为Apple
s。
万一有人质疑我的动机......我想这样做是因为 type 子句弄乱了 postgres 在我fruits
对其他表进行查询时选择的查询计划(是的,我有一个索引type
,甚至尝试了一个 multi -第一栏[type,id]
)。在这里完全描述有点复杂/无关紧要。
mysql - STI MySQL fun select 与 case
我有以下 STI 设置:
我想在返回以下结构的 Animals 表上进行选择:
理想情况下,我想要这样的东西:
但这不起作用,所以我这样做了:
有没有办法使第一个查询工作,如果没有,是否有更好/替代的方法来编写第二个查询?