我正在开发一个连接到第三方 MySQL 数据库的 Rails 项目,我无法更改其架构。到目前为止,我已经能够将所有东西都塞进 rails 中并使其发挥出色,但我遇到了一个有趣的问题。
我有一张 table ,我们称它为foos
.我有一个名为 Foo
的 ActiveRecord 模型使用此表的。问题是这个表代表了两种相似但不同类型的记录。我们称它们为 A 型 Foo 和 B 型 Foo。为了解决这个问题,我创建了两个类,FooTypeA
和 FooTypeB
继承自 Foo
并具有默认范围,以便它们仅包含各自类型的记录。
我的代码看起来像这样:
class Foo < ActiveRecord::Base
# methods common to both types
end
class FooTypeA < Foo
default_scope -> { where is_type_a: true }
# methods for type A
end
class FooTypeB < Foo
default_scope -> { where is_type_a: false }
# methods for type B
end
在大多数情况下,这工作得很好,除了有时关联链会连接这两个模型。由于它们来自同一个表,这会导致歧义问题,并生成爆炸式 SQL 查询。我一直在编写自定义连接查询来解决这个问题,但它很快就会变得很麻烦。
我知道我可以使用 self.table_name
更改模型的默认表名值,但是有没有一种方法可以告诉 Rails 更改模型的 SQL 查询的 FROM 部分,以便我可以将 FooTypeA 中的所有查询读取为:SELECT foo_as.* FROM foos AS foo_as ...
我愿意接受其他建议,但如果可能的话,这似乎是最简单的解决方案。
最佳答案
ActiveRecord .from 方法不能解决您的问题吗?
您还可以创建两个 View (取决于 mysql 版本)并将它们用于表源,但除非您仅从表中读取,否则您可能会遇到可写 View 问题,我会尽量避免.
关于mysql - 在 ActiveRecord 模型的所有查询中更改 FROM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29126719/