循环SQL结果集的更好方法

时间:2013-09-01 22:17:16

标签: 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| %>
<!-- 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查询,我想知道是否有更好(更聪明)的方法吗? 谢谢!

1 个答案:

答案 0 :(得分:2)

您需要MessageTutor之间的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