我有两个表users
和alternative_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关键字(where
,limit
...),而find_by_sql
仅返回一个数组,所以我不能链接。
还请注意,我只希望对某些查询(而不是整个应用程序)执行此操作。因此,我不能使用table_name
。
答案 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
这为您提供了两个非常相似的模型类(相同的方法等),但是将它们分开,以便您知道所要的模型类(例如,关联所关联的模型类)。