ruby-on-rails - 如何在 Rails 中更快地实现昂贵的功能?

标签 ruby-on-rails ruby activerecord

在我的 Rails 4 应用程序中,用户 可以使用跳过按钮单击 edit 他的 invoices View 。

我的问题是每张发票都包含相同的昂贵选择框...

def self.options
  names = []
  names << [ "Please select...", nil ]
  order(:last_name).includes(:company).with_projects.map do |person|
    names << [ person.name, person.id, :'data-address' => person.invoice_address, :'data-email' => person.email ]
  end
  names
end

...尽管所有发票几乎都相同,但它会从头开始计算每张发票。

有没有办法将这些选项存储在某个地方,以便在跳过各种发票时可以更快地调用它们?

感谢您的帮助。

最佳答案

您可以使用 Rails 缓存来执行此操作

def self.options
  Rails.cache.fetch('some_key', expires_in: 10.minutes) do
    ['Please select...', nil ] +
    order(:last_name).includes(:company).with_projects.map do |person|
      [ person.name, person.id, :'data-address' => person.invoice_address, :'data-email' => person.email ]
    end
  end
end

您可以将 'some_key' 更改为唯一的内容,并将超时更改为其他内容,当缓存过期时,rails 将在下一次请求时重新生成它,或者如果您愿意,可以创建一个任务定期生成此缓存。

基本上这个 block 寻找一个名为 'some_key' 的缓存并返回它,但是如果找不到缓存键或者它已经过期它会重新计算其中的代码,缓存它然后返回

此方法在 this guide 中有解释。如果您有兴趣,我已经写了一篇关于不同选项的帖子 over here

关于ruby-on-rails - 如何在 Rails 中更快地实现昂贵的功能?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30012067/

相关文章:

ruby-on-rails - ruby 在 rails 上 : Cannot convert String to Integer

mysql - 使用 CodeIgniter Active Record 计算子行不返回所有结果

ruby-on-rails - 如何逃脱? (问号)运算符在 Rails 中查询 Postgresql JSONB 类型

ruby-on-rails - 为什么关联的模型会被触及?

ruby-on-rails - 如何在 Rails 4 的 Controller 中的方法之间共享变量?

ruby-on-rails - rails : Dynamically selecting an attribute for comparison

ruby-on-rails - 我怎样才能返回 nil 而不是丢失哈希键的错误?

mysql - Rails,多态关联 - 查找具有非死关联记录的记录

ruby-on-rails - 通过rails关联查询

ruby - 应用引擎 : Launching a script upon update/run