在SQL结果集上循环的更好方法
我只是想知道是否有更好的方法对另一个存储在实例变量中的SQL结果集执行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| %> <
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了,而且效果很好!谢谢:我想你们不需要一个团队——你们的意思是订单吗?不,团队可以处理这个案子。谢谢