Ruby on rails 3 Rails 3如何减少查询

Ruby on rails 3 Rails 3如何减少查询,ruby-on-rails-3,activerecord,Ruby On Rails 3,Activerecord,计数: c = Conversation.joins(:messages).random >> Conversation Load (8.1ms) SELECT `conversations`.* FROM `conversations` INNER JOIN `messages` ON `messages`.`conversation_id` = `conversations`.`id` ORDER BY created_at DESC, RAND() LIMIT 1 长度:

计数:

c = Conversation.joins(:messages).random
>> Conversation Load (8.1ms)  SELECT `conversations`.* FROM `conversations` INNER JOIN `messages` ON `messages`.`conversation_id` = `conversations`.`id` ORDER BY created_at DESC, RAND() LIMIT 1
长度:

c.messages.count
>> (5.7ms)  SELECT COUNT(*) FROM `messages` WHERE `messages`.`conversation_id` = 74
如何不执行上述附加查询?我以为我已经使用内部联接为随机会话联接了消息,但是执行了一个新的查询来计算这些结果

第二个问题是试图获取具有特定用户id的所有已加入邮件:

c.messages.length
>> Message Load (1.2ms)  SELECT `messages`.* FROM `messages` WHERE `messages`.`conversation_id` = 82
我使用select进行此操作,无需其他查询:

u = User with id 27 # has messages in 'c' results above
c.messages.where('user_id = ?', u.id).all
>> Message Load (5.3ms)  SELECT `messages`.* FROM `messages` WHERE `messages`.`conversation_id` = 82 AND (user_id = 27)

我仍然很感激如何减少或优化这些查询。

尝试使用
包含
而不是
连接
来避免n+1问题。

Ryan Bates的Railscast#181以一种简单的方式解释了这种差异。

尝试使用
包含
而不是
连接来避免n+1问题。
Ryan Bates的Railscast#181以一种简单的方式解释了这种差异

c.messages.select { |msg| msg.user_id == u.id }
>> returns messages without query logged