ruby-on-rails - 一个大对象还是一个小加一个大信息对象?

标签 ruby-on-rails postgresql activerecord oop

对于 Ruby on Rails 应用程序,我有这个具有多个属性的 Movie 对象。几乎每个页面都需要将一些电影与按评级排序的这些电影的完整列表进行比较,所以我曾经缓存这个大的排序列表。这很有用,因为我可以直接使用这个电影列表及其所有属性,而无需任何其他数据库请求。

最近,这个列表变得越来越大,一个 2500 部电影的大阵列无法放入 1MB 的 Memcache block 中。

我想知道将这个 Movie 对象拆分为一个较小的对象(id、created_at、updated_at、score、attributes_id)并将其属性外化到另一个对象中是否是个好主意。我会有一个较小的按分数排序的电影列表,但还有很多其他请求。

既然如此,为什么不缓存一个包含 2500 个整数的数组,用 Ruby 做数学运算,只得到我们感兴趣的 50 部电影呢?它需要 50 次数据库调用,还是我可以让 PostGreSQL 给我一个电影 2、5、6、89、……和 2467 的数组?

我该怎么办?我还遗漏了问题的哪些其他部分?

谢谢你,

凯文

最佳答案

与其从模型中剥离属性,不如只加载您需要的属性?在进行简单的数值比较时,直接使用数据而不是涉及模型通常对您有利。简单散列的存储要求大大低于完整的 ActiveRecord 实例。

在这种情况下,select_all 是您的 friend :

class Movie < ActiveRecord::Base
  def self.data_for(*ids)
    select_all(
      sanitize_sql([ "SELECT id, score FROM #{quote_table_name} WHERE id IN (?)", ids.flatten ])
    ).inject({ }) do |h, row|
      h[row[:id].to_i] = row
      h
    end
  end
end

这将产生一个简单的散列,看起来像这样:

Movie.data_for(2, 5, 6, 89, 2467)
# => { 2 => { :id = > '2', :score => '4' }, ... }

如果你想根据需要将字符串转换为整数,你可以清理结构,这将进一步降低你的存储需求。您可以使用纯数字和简单的散列来存储大量数据。

在这一点上,将这个散列存储在 Memcache 中是使用 Rails.cache

的简单练习

关于ruby-on-rails - 一个大对象还是一个小加一个大信息对象?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3972916/

相关文章:

postgresql - 使用 Korma 运行原始 sql 时如何在准备好的语句中传递 clojure 向量?

ruby-on-rails - first_or_create与find_or_create_by

ruby-on-rails - 关于我在测试数据库中截断表的方法

ruby-on-rails - 如何添加我已使用 Carrierwave 上传的图像的缩略图版本

ruby-on-rails - Ruby 挽救多个特定错误

postgresql - 如何使用 beego/orm 解决 'no LastInsertId available'

mysql - ActiveRecord 迁移 - 日期时间到时间戳

ruby-on-rails - update_all之后的Rails Elastic Search重新索引数据

ruby-on-rails - 如何在I18n.translate中传递参数

大型查询 : An I/O error occurred while sending to the backend 上的 Java PostgreSQL 错误