x = User.all创建哈希?我该如何遍历它?

时间:2016-04-07 16:34:35

标签: ruby-on-rails ruby-on-rails-4 activerecord

假设我有一个User表和一个Messages表,它们有一个has_many belongs_to关系。我想找到id:对于名字为“Bob”的用户,然后拉出其中一个id的消息历史记录。

Cloudera Manager

这是否会在变量x中创建一个哈希值,其中包含名称为Bob的用户的所有结果?当我运行x时,控制台中的结果看起来像哈希。要包含与所有Bobs相关的消息,我想我会这样做:

x = User.where(name: "Bob")

现在我有了x ...如何找到名字叫鲍勃的人的身份证?我不想再次查询数据库,我想通过变量完成所有操作,这可能吗?

然后我想在我的表中获得第一个id(第一个Bob)的第一条消息。可以通过变量完成,或者一旦我有第一个id,我是否必须返回DB?

感谢所有帮助男士和女士们!

3 个答案:

答案 0 :(得分:1)

这样做。如导轨指南中所述。 http://guides.rubyonrails.org/active_record_querying.html第13.2节

x = Message.includes(:users).where(users: { name: "Bob"})

然后在查询结束时获取第一条消息.first。

x = Message.includes(:users).where(users: { name: "Bob"}).first

答案 1 :(得分:1)

大多数ActiveRecord查询返回Relation

您可以调用x = x.to_a使rails执行实际查询(将有2个SQL查询 - 一个用于用户,一个用于消息),然后遍历生成的数组。

答案 2 :(得分:0)

您需要从消息而不是用户查询。连接(内连接)和包含(左外连接)可用于急切加载,如您的问题,或跨多个表进行查询。

Message.joins(:user).where('user.name = "bob"')