2012-08-03 187 views
0

我试图从轨查询我的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> 

在哪里我出了问题将是巨大的

回答

1

查询到的ActiveRecord总是返回的ActiveRecord ::关系。这样做基本上允许延迟加载查询。要理解为什么这是很酷的,想想看:

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就会去DB来获取记录。这可以防止不必要的查询ActiveRecord能够做到这一点,因为它们返回关系,而不是查询的对象。想到Relation类的最好方法是它是一个包含数组所有方法的ActiveRecord实例。你可以调用一个关系的查询,但你也可以迭代它。

对不起,如果不明确。

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

+0

查询工作,虽然与阵列,我如何从它内部访问信息?即说我想在名为first_name的列中提取管理者名称? – 2012-08-03 15:24:56

+1

'is_manager(team).map {| m | m.first_name}'将返回一个包含所有经理名字的数组。您也可以使用如下的地图缩写:'is_manager(team).map(&:first_name)'。 – Max 2012-08-03 16:06:33

+0

下一个问题,我有最大,如果我有以下'def全名(用户) “#{user.first_name}#{user.last_name}” 结束',并希望返回full_name没有方括号和引用逗号是什么被需要?因为我尝试了'is_manager(team).map(&:full_name)'尽管它没有工作。谢谢 – 2012-08-04 11:02:38

0

就任何帮助用.first检索第一条记录,这可能会有所帮助。 User.where( “经理<> 0 AND TEAM_ID ==:TEAM_ID”,{:TEAM_ID => team.id})。第一

+0

问题是可能有多个经理分配给一个团队,因为我希望能够列出他们 – 2012-08-03 14:39:51