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

标签 mysql ruby-on-rails ruby activerecord

我正在开发一个连接到第三方 MySQL 数据库的 Rails 项目,我无法更改其架构。到目前为止,我已经能够将所有东西都塞进 rails 中并使其发挥出色,但我遇到了一个有趣的问题。

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

我愿意接受其他建议,但如果可能的话,这似乎是最简单的解决方案。

最佳答案

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

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

关于mysql - 在 ActiveRecord 模型的所有查询中更改 FROM,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29126719/

相关文章:

php - 将 mysql 查询包装在 php 函数中并打印结果

mysql - 如何按特定顺序列出mysql查询结果?

ruby-on-rails - Shrine.rb - 上传后如何访问文件路径/原始文件

ruby-on-rails - 在每个循环中创建动态 form_tag

c - 如何在调用之间的 Ruby 扩展中将 C 对象保留在内存中?

MySQL 使用 DISTINCT 返回其他列

php - MYSQL查询忽略每一个重复项

sql - rails/SQL : Group by and sum each day in the last 2 weeks

ruby-on-rails - Ruby:在运行时观察方法(重新)定义

ruby-on-rails - 如何从外部访问 Ruby on Rails 应用程序的数据?