在ActiveRecord模型的所有查询中更改FROM

时间:2015-03-18 15:55:30

标签: mysql ruby-on-rails ruby activerecord

我正在开发一个连接到第三方MySQL数据库的rails项目,我无法更改的架构。到目前为止,我已经能够将所有内容装入导轨并使其发挥得很好,但我遇到了一个有趣的问题。

我有一张桌子,我们称之为foos。我有一个名为Foo的ActiveRecord模型使用此表。问题是该表代表两种相似但不同类型的记录。我们将它们称为Foo类型A和Foo类型B.为了解决这个问题,我创建了两个类FooTypeAFooTypeB,它们继承自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 ...

我对其他建议持开放态度,但如果可能的话,这似乎是最简单的解决方案。

1 个答案:

答案 0 :(得分:0)

ActiveRecord .from方法不会解决您的问题吗?

您还可以创建两个视图(取决于mysql版本)并将其用于表源,但除非您从表中读取,否则您可能会遇到可写的视图问题,我会尽量避免