【问题标题】:How to fetch data from multiple tables with one SQL query in Hanami?如何在 Hanami 中使用一个 SQL 查询从多个表中获取数据?
【发布时间】:2018-10-05 06:37:01
【问题描述】:

我的 Hanami 模型 UserUserInfo 具有 has_one 关联。

存储库如下所示:

class UserInfoRepository < Hanami::Repository
end

class UserRepository < Hanami::Repository
  associations do
    has_one :user_info
  end
end

问题:我可以通过一个查询加入并加载两个表? (我正在寻找类似于 Rails 的includes)。

到目前为止我已经尝试过

def users_with_info
  users.join(:user_info)
end

它执行连接,但不从user_infos 表中选择列。

提前致谢。

【问题讨论】:

  • 我对 Hanami 不熟悉,但看起来它在幕后使用了 rom-repositorysequelaggregate(:user_info) 之类的东西应该根据 api.rom-rb.org/rom/ROM/Repository/… 工作,如果这有帮助,请告诉我,以便我可以将其作为答案
  • 谢谢。 aggregate 与我想要实现的非常相似:它返回我试图获取的同一组数据,但它执行 2 个请求:-首先获取所有 users -第二个获取所有 user_infos 与条件user_id IN (1,2,3,4, 5 ...)。它只是在 SQL 查询中枚举所有获取的用户的 id。
  • 我想知道执行连接然后显式聚合是否会起作用。对不起,我对宝石了解不多。只是模糊地看了看文档

标签: ruby hanami ruby-object-mapper


【解决方案1】:

当您通过 Hanami 中的存储库获取数据时,结果集将映射到实体中。 默认情况下,UserRepository 将映射到 User 实体。我猜该实体没有来自user_info 的列的属性。

你需要做的是创建一个实体,它可以包含你想从数据库中获取的数据,然后在结果集上调用.as(ThatEntityYouCreated)。例如,

def users_with_info
  users.join(:user_info).map_to(UserWithInfo)
end

如果您不想创建实体而只想获取普通哈希,您可以这样做:

users.join(:user_info).map.to_a

但是,我认为这是一个拐杖。你不应该从你的 Repository 方法返回哈希值。

【讨论】:

    【解决方案2】:

    我相信我们在一个 Hanami 项目中与我的一位队友遇到了这个确切的问题,我是 how we solved it

    我们基本上绕过了 Hanami 存储库,直接进入底层 ROM 关系,使用 ROM::Relation#wrap 以使我们的 User 实体与感兴趣的实体结合。

    让我们知道它是否对您有帮助,或者您是否需要更多详细信息。干杯!

    【讨论】:

      猜你喜欢
      • 2020-11-29
      • 1970-01-01
      • 1970-01-01
      • 2018-06-15
      • 2015-06-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-28
      相关资源
      最近更新 更多