Rails 4:从数据库初始化散列 table 的正确方法?

Rails 4: the right way to initialize hash table from database?

我的第一个问题,温柔点:-)

我有一个 rails 应用程序使用数据库中的文本片段(table 基本上包含一个短键 k 和相应的文本;有点像 i18n,但出于此处超出范围的原因我现在不想使用它)。按照 "Text.find_by k: x" 的行,为视图创建了一个小的辅助函数来按键获取匹配的文本。数据库加载的地狱,但允许 CMS 动态更改文本。

但由于事实证明文本很少更改,所以我想将整个 table 预加载到哈希中。由于我不确定将此类初始化内容放在哪里,也因为我认为延迟加载可能很酷,所以这是我所做的(简化):

module MainHelper
...
@@items = nil

def getText(x)
  initItems if !@@items
  @@items[x]
end

private

def initItems
  @@items = {}
  Text.all.each {|t| @@items[t.k] = t.text}  #load from model
end

这似乎很管用。但是由于我在这里是个新手,我想知道是否有人认为有更好的解决方案,或者更 "the rails way" 的解决方案?非常感谢任何评论!

你做的很酷。我更有可能制作一种方法 items 来记忆这些项目,而不是显式的 initItems 方法。那将是更传统的解决方案。

使用 pluck 仅获取 table 中您需要的字段...这将使 SQL 调用更有效率。

因为pluck在本例中returns是一个二元素数组的数组,所以很容易使用to_h方法将其转换为散列。

(另外,惯例是使用 snake_case 作为方法名称)

module MainHelper
  ...
  @@items = nil

  def get_text(x)
    items[x]
  end

  private

  def items
    @@items ||= Text.pluck(:k,:text).to_h  #load from model
  end

end