【问题标题】:querying active record查询活动记录
【发布时间】:2012-08-01 14:46:48
【问题描述】:

我正在尝试使用以下查询从 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>

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

【问题讨论】:

    标签: ruby-on-rails postgresql activerecord


    【解决方案1】:

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

    【讨论】:

    • 问题是可能有多个经理分配给一个团队,因为我希望能够列出他们
    【解决方案2】:

    对 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 对象转换为用户数组。

    【讨论】:

    • 该查询有效,尽管使用数组,我如何从其中访问信息?即说我想在名为 first_name 的列中提取经理姓名?
    • is_manager(team).map { |m| m.first_name } 将返回一个包含所有经理姓名的数组。您还可以使用如下所示的地图简写:is_manager(team).map(&amp;:first_name)
    • 下一个问题我有 Max,如果我有以下 def full_name(user) "#{user.first_name} #{user.last_name}" end 并且想要返回不带方括号和引号的全名,需要什么?当我尝试is_manager(team).map(&amp;:full_name) 时,虽然它没有用。谢谢
    • map 方法返回一个结果数组。如果你直接打印出数组,那么你会得到方括号和逗号。如果您想将它们打印为视图中的列表,您可以执行以下操作:gist.github.com/3274840
    猜你喜欢
    • 1970-01-01
    • 2016-03-10
    • 2013-02-01
    • 2013-04-23
    • 2016-11-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-07
    相关资源
    最近更新 更多