如何在生产环境 运行 多台服务器上使 ActiveRecord 查询更快?

How to make ActiveRecord query faster on production environment running multiple servers?

如何重写 ActiveRecord 查询来解决这个问题?我是一名 python 程序员并使用 sqlalchemy,所以如果能从 python 的角度解释这件事就好了。我真的只需要知道如何解决这个问题。

我知道这个问题可能与在每台服务器上打开的连接有关,因此与单服务器暂存环境相比,生产环境中 运行 的速度较慢。但我不知道如何解决这个问题。我习惯在 python 中编程,我使用 sqlalchemy,它已经针对这种分布式系统进行了优化。

class Board < ActiveRecord::Base
    def messages
        message_ids = Message.where("board_id = ?", self.id).map { |c| c.id }
        message_ids.map { |message_id| Message.find_by_id(message_id) }
    end
end

ActiveRecord 查询已在多服务器生产环境和单服务器暂存环境中优化为 运行。

如果我没记错的话,你想要做的是 select all messages 特定的 board.

如果这是正确的,你可以这样做:

def messages
  Message.where(board_id: self.id)
end

这将检索特定版块的所有消息。

现在,你可以为一个板调用这个方法,例如这样:

board = Board.first
board.messages

有关更多信息,请查看此参考资料:https://guides.rubyonrails.org/active_record_querying.html

希望这对您有所帮助。

app/models/board.rb

class Board < ActiveRecord::Base
  has_many :messages
end

以上将允许您执行以下操作:

board = Board.first
board.messages
# => returns a `ActiveRecord::Associations::CollectionProxy` object
#    for beginners, simply treat `ActiveRecord::Associations::CollectionProxy` as
#    if that's an Array object. So you can still do something like

board.messages.first
# => #<Message id: 123, ...>
  • 现在你还需要在下面添加(但不是回答你的问题所必需的)

app/models/message.rb

class Message < ActiveRecord::Base
  belongs_to :board
end

...这将使您能够:

message = Message.first
message.board
# => #<Board id: 456, ...>

Rails association docs here

特别注意 "implied conventions",例如隐含的 foreign_keyclass_name