0

我正在尝试使用以下查询从 rails 查询我的 postgres db

    def is_manager(team)
    User.where("manager <> 0 AND team_id == :team_id", {:team_id => team.id})
  end

这基本上是检查经理是否被标记,并且 team.id 是传递给函数的当前 id。

我认为我有以下代码

 %td= is_manager(team)

错误或我们得到的回报是

#<ActiveRecord::Relation:0xa3ae51c>

任何关于我哪里出错的帮助都会很棒

4

2 回答 2

1

对 ActiveRecord 的查询总是返回 ActiveRecord::Relations。这样做本质上允许延迟加载查询。要了解为什么这很酷,请考虑以下几点:

User.where(manager: 0).where(team_id: team_id).first

在这种情况下,我们获取所有不是经理的用户,然后我们获取所有在团队中 ID 为 team_id 的非经理用户,然后我们选择第一个。执行此代码将为您提供如下查询:

SELECT * FROM users WHERE manager = 0 AND team_id = X LIMIT 1

如您所见,即使在我们的代码中进行了多个查询,ActiveRecord 也能够将所有这些压缩到一个查询中。这是通过关系完成的。一旦我们需要实际对象(即我们第一次调用时),ActiveRecord 就会去数据库获取记录。这可以防止不必要的查询。ActiveRecord 之所以能够做到这一点,是因为它们返回的是关系,而不是查询的对象。考虑 Relation 类的最佳方式是,它是 ActiveRecord 的一个实例,具有数组的所有方法。您可以对关系调用查询,但也可以对其进行迭代。

抱歉,如果不清楚。

哦,解决你的问题。%td = is_manager(team).to_a这会将 Relation 对象转换为用户数组。

于 2012-08-03T14:52:39.797 回答
0

只需使用 .first 检索第一条记录,这可能会有所帮助。 User.where("manager <> 0 AND team_id == :team_id", {:team_id => team.id}).first

于 2012-08-03T14:33:16.747 回答