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

如何跨关联创建单个查询

  •  1
  • Obromios  · 技术社区  · 7 年前

    我有一个 user 有一个的模型 profile 还有一个 goal . 这个 轮廓 有一个hstore类型的privacy字段,该字段中可以有一个哈希,表示可以公开显示 目标 ,如果 目标 可以显示。我想要一个可以公开显示的所有目标的列表。我最初的尝试是

       def list_public
          profiles = Profile.includes(:user).where("privacy @> hstore('show_goals','1')")
          goals = []
          profiles.each do |p|
            goals << p.user.goals.first
          end
          goals
        end
      end
    

    当有少数用户选择允许显示他们的目标,但显然不可缩放时,这一点很好。有单人的还是双人的 ActiveRecord 可以执行此代码作业的SQL查询?我正在使用 ruby on rails 5.1 .

    1 回复  |  直到 7 年前
        1
  •  1
  •   Stefan Daschek    7 年前

    最简单的方法是也急着加载 goals 在您的查询中:

    profiles = Profile.includes(:user, user: :goals).where("privacy @> hstore('show_goals','1')")
    

    这将产生一个额外的查询来获取所有目标。然后您仍然可以按原样使用剩余的代码, p.user.goals.first 不会生成其他数据库查询。