【发布时间】:2018-07-12 00:47:35
【问题描述】:
嘿,所以我是活动记录的新手,我在这里有这两个地图功能,我想知道是否有更好/更高效的方法来进行以下查询:
现在,当我执行查询时,我的终端中有数百行,如果很多人同时加载这些对话,恐怕会占用大量内存?
第 1 步获取所有相关对话
第 2 步制作一个对话哈希,其中包含有关发件人、收件人和链接到该对话的消息的所有信息。
第 3 步将所有这些对话按正确的顺序排序,即从对话中对它们进行排序,最新消息位于顶部。
编辑 1:Rails 版本 5.0.1
def index
i = 1
@messages = []
@user = User.find_by(email: params[:email])
@message = Conversation.where("sender_id = ? OR recipient_id = ?", @user.id, @user.id)
@message.map { |conversation|
@messages << conversation if Message.where(conversation_id: conversation.id).count > 0
}
render json: @messages.map { |conversation|
{
date: conversation.messages.last.created_at,
sender: User.find(conversation.sender_id),
recipient: User.find(conversation.recipient_id),
conversation: {
id: conversation.id,
messages: Message.where(conversation_id: conversation.id).sort_by{|e| e[:created_at]}.reverse.map {|message| {
sender: {
email: User.find(message.user_id).email,
first_name: User.find(message.user_id).first_name,
last_name: User.find(message.user_id).last_nam },
body: message.body,
created_at: message.created_at
}
}
}}
}.sort_by { |hsh| hsh[:date] }.reverse
end
【问题讨论】:
-
是的,这效率不高,因为在此操作中执行了多个 N+1 查询。关注模型之间的关系以避免这种情况。似乎特定用户将通过消息进行许多对话。在您的用户模型中定义此关系,您应该能够调用
@user.conversations,ActiveRecord 将执行有限数量的查询。
标签: ruby-on-rails json ruby activerecord