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
我的第一个问题,温柔点:-)
我有一个 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