1

假设我有一个用户模型。它有一个名为 status 的实例方法。状态不是关联。它不遵循任何活动记录模式,因为它是一个已经在生产中的数据库。

class User < ActiveRecord::Base  

  def status
    Connection.where(machine_user_id: self.id).last
  end    

end

所以我这样做。

@users = User.all

首先,我不能急于加载状态方法。

@users.includes(:status).load

其次,我无法在用户数组中缓存该方法。

Rails.cache.write("user", @users)

status 方法永远不会被调用,直到它看起来像视图层。

缓存此方法的推荐方法是什么。

也许这个实例方法不是我想做的。我已经查看了范围,但它看起来不像我想要做的。

也许我只需要一个协会?然后我得到包含,我可以缓存。

但是关联可以处理复杂的逻辑吗?在这种情况下,实例方法是一个简单的查询。如果我在该实例方法中有复杂的逻辑怎么办?

谢谢你的帮助。

4

1 回答 1

1

您是否尝试过将此逻辑封装在像这样的普通 Ruby 对象中(尽管我不会将其用于非常大的集合):

class UserStatuses
  def self.users_and_statuses
    Rails.cache.fetch "users_statuses", :expires_in => 30.minutes do
      User.all.inject({}) {|hsh, u| hsh[u.id] = u.status; hsh }
    end
  end
end

之后您可以使用一些帮助方法来访问缓存版本

class User < ActiverRecord::Base
  def cached_status
    UserStatuses.users_and_statuses[id]
  end
end

它不能解决你的急切加载问题,Rails 没有内置任何缓存预热技术。但是通过这样的提取,通过在 Cron 中运行 rake 任务很容易完成。

同样在这种情况下,我看不到使用关联有任何问题。Rails 关联允许您提交不同的选项,包括外键和主键。

于 2013-10-09T19:45:37.340 回答