使用 Arel 跨表查询
Query across tables with Arel
我有两个 table,users
和 alternative_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 关键字(where
、limit
...)和 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
这为您提供了两个非常相似的模型 类(相同的方法等),但将它们分开,以便您知道您要的是哪一个(例如,关联链接到哪个) .
我有两个 table,users
和 alternative_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 关键字(where
、limit
...)和 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
这为您提供了两个非常相似的模型 类(相同的方法等),但将它们分开,以便您知道您要的是哪一个(例如,关联链接到哪个) .