Ruby on rails 我想知道如何消灭那些无用的,我会给你赏金的。谢谢你的提示。很高兴我最终能帮助你!让我们知道!在Rails 4+中,.all将构建一个ActiveRecord::Relation对象,并且不会立即触发查询。相反,您需要在查询中调用以_a。确实,但是对于Rai

Ruby on rails 我想知道如何消灭那些无用的,我会给你赏金的。谢谢你的提示。很高兴我最终能帮助你!让我们知道!在Rails 4+中,.all将构建一个ActiveRecord::Relation对象,并且不会立即触发查询。相反,您需要在查询中调用以_a。确实,但是对于Rai,ruby-on-rails,ruby-on-rails-3,performance,eager-loading,preloading,Ruby On Rails,Ruby On Rails 3,Performance,Eager Loading,Preloading,我想知道如何消灭那些无用的,我会给你赏金的。谢谢你的提示。很高兴我最终能帮助你!让我们知道!在Rails 4+中,.all将构建一个ActiveRecord::Relation对象,并且不会立即触发查询。相反,您需要在查询中调用以_a。确实,但是对于Rails 4,我将使用all.load通过返回一个ActiveRecordRelationship以_a。太棒了,我不知道这一点。谢谢好吧,我尊重你的方法,但这又增加了一个问题。我不能完全理解控制台和服务器之间的区别。我没有说任何关于控制台和服务器


我想知道如何消灭那些无用的,我会给你赏金的。谢谢你的提示。很高兴我最终能帮助你!让我们知道!在Rails 4+中,
.all
将构建一个
ActiveRecord::Relation
对象,并且不会立即触发查询。相反,您需要在查询中调用
以_a
。确实,但是对于Rails 4,我将使用
all.load
通过
返回一个ActiveRecordRelationship以_a
。太棒了,我不知道这一点。谢谢好吧,我尊重你的方法,但这又增加了一个问题。我不能完全理解控制台和服务器之间的区别。我没有说任何关于控制台和服务器的内容。基本上,不能使用包含的联接是ActiveRecords的一个限制。我为您提供的是最好、最正确的解决方案。你只需要一个额外的查询,而不是原来的17个,这就是你开发这些解决方案的方法。如果您查看控制台output.config.cache_,这不是一个限制,因为它与查询无关。我提供的是正确的解决方案,不应导致查询变为18。@Arkhitech您的解决方案只是一个额外的查询。我已经测试过了,虽然我知道这是一个错误的解决方案。我正在使用postgresql,检查类似的问题。嗯……我没有环境设置来手动测试此问题,但是config.cache_类不可能对查询产生任何影响。加载类(模型)架构在mini profiler中显示为查询Sue已在此处报告给mini profiler:和
- @messages.each do |message|
    %li.conversation-container
        %a{href: conversation_path(message.conversation_id)}
            - if message.sender != current_user 
                .notification-avatar{style: "background: url(#{message.sender.avatar_url}); background-size: contain; background-repeat: no-repeat; background-position: 50% 50%;"}
            - else
                - other_participant = message.conversation.conversation_participants.select{|p| p.user_id != current_user.id }.first.user 
                .notification-avatar{style: "background: url(#{other_participant.avatar_url}); background-size: contain; background-repeat: no-repeat; background-position: 50% 50%;"}
            %p
                %strong
                    - if message.sender != current_user 
                        = message.sender.name
                    - else
                        = other_participant.name
                %br
                - if message.sender == current_user
                    %i.fa.fa-mail-reply-all
                = truncate(message.body,length: 25)

                .time
                    = time_ago_in_words(message.created_at)
                    ago
- if @messages.count == 0
    %li
        .empty-state-text-white
            No messages
2.0.0-p353 :006 > ms = Message.dropdown_for(3).all
  Message Load (1.2ms)  SELECT "messages".* FROM "messages" LEFT JOIN messages AS m ON messages.id != m.id 
 AND m.conversation_id = messages.conversation_id 
 AND messages.created_at < m.created_at INNER JOIN conversation_participants AS cp ON cp.conversation_id = messages.conversation_id AND cp.user_id = 3 WHERE (m.id IS NULL) ORDER BY cp.seen , cp.updated_at DESC LIMIT 5
  User Load (0.7ms)  SELECT "users".* FROM "users" WHERE "users"."id" IN (6, 4, 5)
  Conversation Load (0.4ms)  SELECT "conversations".* FROM "conversations" WHERE "conversations"."id" IN (4, 2, 3)
  ConversationParticipant Load (0.2ms)  SELECT "conversation_participants".* FROM "conversation_participants" WHERE "conversation_participants"."conversation_id" IN (4, 2, 3)
  User Load (0.6ms)  SELECT "users".* FROM "users" WHERE "users"."id" IN (6, 3, 4, 5)
 => [#<Message id: 8, body: "saSasa", sender_id: 6, conversation_id: 4, sent: true, attachment_id: nil, attachment_type: nil, created_at: "2014-11-17 16:05:40", updated_at: "2014-11-17 16:05:40">, #<Message id: 2, body: "asdnas dagsdashjdg jahs d", sender_id: 4, conversation_id: 2, sent: true, attachment_id: nil, attachment_type: nil, created_at: "2014-11-17 11:32:36", updated_at: "2014-11-17 11:32:36">, #<Message id: 6, body: "SADASD A DSA ", sender_id: 5, conversation_id: 3, sent: true, attachment_id: nil, attachment_type: nil, created_at: "2014-11-17 13:43:34", updated_at: "2014-11-17 13:43:34">] 

2.0.0-p353 :007 > ms.first.conversation.conversation_participants.select{|cp| cp.user_id != 3}.first.user
 => #<User id: 6, first_name: "Ddsfsd", middle_name: nil, last_name: "Fsdfsd", photo: nil, email: "1@k.com", encrypted_password: "$2a$10$5sGIb2DbQ1ctMrTzD3AJ0uV18hhiC5Ei1wcfE7MSAvRU...", reset_password_token: nil, reset_password_sent_at: nil, remember_created_at: nil, sign_in_count: 1, current_sign_in_at: "2014-11-17 15:27:06", last_sign_in_at: "2014-11-17 15:27:06", current_sign_in_ip: "127.0.0.1", last_sign_in_ip: "127.0.0.1", confirmation_token: nil, confirmed_at: "2014-11-17 15:27:48", confirmation_sent_at: "2014-11-17 15:27:05", unconfirmed_email: nil, failed_attempts: 0, unlock_token: nil, locked_at: nil, authentication_token: nil, created_at: "2014-11-17 15:27:05", updated_at: "2014-11-17 15:27:48", slug: "ddsfsd_fsdfsd"> 

2.0.0-p353 :008 > ms.count
 => 3 
message_ids = Message.joins("LEFT JOIN messages AS m ON messages.id != m.id 
          AND m.conversation_id = messages.conversation_id 
          AND messages.created_at < m.created_at")
   .where('m.id IS NULL')
   .joins("INNER JOIN conversation_participants AS cp 
          ON cp.conversation_id = messages.conversation_id 
          AND cp.user_id = #{user_id}")
   .order("cp.seen, cp.updated_at DESC")
   .limit(5).map(&:id)

messages = Message.includes(:sender).
    includes(conversation: [{conversation_participants: :user}]).
    where(id: message_ids)