查询活动记录

时间:2012-08-03 14:25:15

标签: ruby-on-rails postgresql activerecord

我正在尝试使用以下查询从rails查询我的postgres数据库

    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>

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

2 个答案:

答案 0 :(得分:1)

对ActiveRecord的查询始终返回ActiveRecord :: Relations。这样做基本上允许延迟加载查询。要理解为什么这很酷,请考虑一下:

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

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

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

正如您所看到的,即使在我们的代码中进行了多次查询,ActiveRecord也能够将所有这些查询压缩到一个查询中。这是通过Relation完成的。一旦我们需要实际对象(即我们先调用),ActiveRecord就会转到DB来获取记录。这可以防止不必要的查ActiveRecord能够执行此操作,因为它们返回的是Relation,而不是查询的对象。想想Relation类的最好方法是它是ActiveRecord的一个实例,它包含数组的所有方法。您可以对关系调用查询,但也可以对其进行迭代。

很抱歉,如果不清楚的话。

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

答案 1 :(得分:0)

只需使用.first检索第一条记录,这可能有所帮助。 User.where(“manager&lt;&gt; 0 AND team_id ==:team_id”,{:team_id =&gt; team.id})。首先