使用 Arel 跨表查询

Query across tables with Arel

我有两个 table,usersalternative_users 除了一些 MySQL 性能调整外完全相同。

我希望能够从第一个模型查询第二个 table 以便能够 运行 测试而无需更改我的整个代码库。

这意味着能够让此查询命中 alternative_users table 但仍然 return User 对象。总结一下:

users = User.select(fields).where(conditions).limit(10) # hits alternative_users

# or

users = AlternativeUser.select(fields).where(conditions).limit(10) # returns User object

注意find_by_sql有这个能力:

users = User.find_by_sql("select * from alternative_users")`

... 它工作正常,但我想避免重写代码并且我的代码库中充满了 arel 关键字(wherelimit...)和 find_by_sql只是 return 一个数组,所以我不能链接。

另请注意,我只希望对少数几个查询执行此操作,而不是整个应用程序。因此我不能使用 table_name.

要仅更改单个 Relation 查询,有一种方法:from 将覆盖 FROM 子句以指向您喜欢的任何内容。

User.select(:name).from("alternative_users").to_a
# SELECT name FROM alternative_users;

如果您想从整个应用程序访问这两个表,那么我建议使用 sub类:

User 重命名为 AbstractUser,并添加:

self.abstract_class = true

然后创建空子类:

class User < AbstractUser
end

class AlternativeUser < AbstractUser
end

这为您提供了两个非常相似的模型 类(相同的方法等),但将它们分开,以便您知道您要的是哪一个(例如,关联链接到哪个) .