使用Arel跨表查询

时间:2018-08-16 07:36:37

标签: ruby-on-rails ruby ruby-on-rails-5 arel

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

我希望能够从第一个模型中查询第二个表,以便能够运行测试而不必更改我的整个代码库。

这意味着能够使该查询命中alternative_users表,但仍返回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仅返回一个数组,所以我不能链接。

还请注意,我只希望对某些查询(而不是整个应用程序)执行此操作。因此,我不能使用table_name

1 个答案:

答案 0 :(得分:2)

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

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

如果您要在整个应用程序中访问两个表,则建议使用子类:

User重命名为AbstractUser,然后添加:

self.abstract_class = true

然后创建空的子类:

class User < AbstractUser
end

class AlternativeUser < AbstractUser
end

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