在SQL结果集上循环的更好方法

在SQL结果集上循环的更好方法,sql,ruby-on-rails,rails-activerecord,Sql,Ruby On Rails,Rails Activerecord,我只是想知道是否有更好的方法对另一个存储在实例变量中的SQL结果集执行SQL查询 我的代码如下所示: def index id = current_user.id.to_s #First SQL query @messages = Message.where("user_id = ? OR recipient_id = ?", id, id).group('recipient_id') end 在我看来 <% @messages.each do |m| %> <

我只是想知道是否有更好的方法对另一个存储在实例变量中的SQL结果集执行SQL查询

我的代码如下所示:

def index
  id = current_user.id.to_s

  #First SQL query
  @messages = Message.where("user_id = ? OR recipient_id = ?", id, id).group('recipient_id')
end
在我看来

<% @messages.each do |m| %>
<!-- Second SQL query -->
<% r = Tutor.find(m.recipient_id).user %>
  <%= "#{r.first_name + ' ' + r.last_name}" %><br />
  <%= m.subject %><br />
  <%= m.body %><br />
  <%= m.user_id %><br />
  <%= m.recipient_id %><br />
<% end %>






我在@messages上循环,然后对每个对象进行SQL查询,我想知道是否有更好(更智能)的方法来实现这一点?
谢谢

您需要在
消息
导师
之间建立ActiveRecord关联。我需要看一看您的模型,以确切地说明如何关联它们,但您基本上是自己进行关联工作,而不是将其转移到AR/SQL

一旦你有了适当的关系,你就会看到这些东西

在控制器中:

def index
  id = current_user.id
  @messages = Message.includes(:tutor).where("user_id = ? OR recipient_id = ?", id, id).group(:recipient_id)
end
在你看来:

<% @messages.each do |m| %>
  <%= m.tutor.user.to_s %><br />
  <%= m.subject %><br />
  <%= m.body %><br />
  <%= m.user_id %><br />
  <%= m.recipient_id %><br />
<% end %>






在您的用户模型中:

class User < ActiveRecord::Base
  def to_s
    "#{first_name} #{last_name}"
  end
end
class用户
@DaniG2k这个答案的要点是使用
包含(:tutor)
。这是调用的,在加载相关记录时防止n+1查询。顺便说一下,我认为
中不应该有{user.first\u name}{user.last\u name}
。最好是在
User
中的
fullname
方法中使用
m.tutor.User.fullname
(IMO)。虽然他可能应该使用STI来表示
User
tutor
之间的“关系”,但不是像他现在这样
用户属于:tutor
tutor:has\u one:User
。但这是另一个问题…感谢所有伟大的建议,伙计们!是的,理想情况下应该是m.tutor.user.fullname。我的模型关系现在是这样建立的:
class-User
class-tutor'recipient\u id'end
类消息
我如何设置它,以便只需执行m.tutor.user??非常感谢!!!是的,我已经改变了我的模型,这样我现在就可以做m.tutor.user了,而且效果很好!谢谢:我想你们不需要一个团队——你们的意思是订单吗?不,团队可以处理这个案子。谢谢