代码之家  ›  专栏  ›  技术社区  ›  marcgg

使用Arel跨表查询

  •  0
  • marcgg  · 技术社区  · 6 年前

    users alternative_users 除了一些MySQL的性能调整之外,这是完全相同的。

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

    其他用户 但仍然返回 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 …)和 按sql查找 只返回一个数组,这样我就无法链接。

    table_name .

    1 回复  |  直到 6 年前
        1
  •  2
  •   matthewd    6 年前

    要只更改单个关系查询,有一种方法: 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
    

    这给了您两个非常相似的模型类(相同的方法等),但它们是分开的,这样您就知道您要的是哪个模型类(例如,关联链接到哪个模型类)。