假设我有一个我想要使用的红宝石宝石,但只在一个模型或控制器中使用它。
有没有办法专门为那个模型或控制器加载那个gem?
系统范围内可用(可从任何控制器调用)是否浪费资源
答案 0 :(得分:5)
发布的答案不正确,完全可以只为特定型号或控制器加载宝石。您的Gemfile允许您定义Bundler可用于要求某些宝石的组。默认情况下,任何未分组的宝石以及当前运行的环境的宝石都是必需的,并且不需要任何命名组。所以如果你有以下Gemfile:
gem 'always_used_gem', '1.0.0'
group :rarely_used do
gem 'rarely_used_gem', '1.0.0'
end
然后在初始应用程序加载时不需要rarely_used_gem
。如果您有一个需要该功能的特定方法,您可以这样做:
def do_stuff
Bundler.require :rarely_used
# use stuff from rarely_used_gem
end
一个注意事项:确保Bundler.require在方法调用中或类似的内容,否则在解析文件时将需要该组(即应用程序启动)
就是否要这样做而言,它应该只用于特殊情况。通过这样做,您可以将启动速度与执行速度进行交易,这在开发中可能有意义,但可能不会在生产中。此外,如果两个宝石之间存在某些不兼容性,您可以使用此方法(例如,我们使用此方法解决几个AWS宝石之间的问题。)
答案 1 :(得分:3)
不,这是不可能的。一旦宝石加载,它将可用于所有控制器/型号/一切。这不应该是您的主要关注点。 RAM和CPU时间很便宜,程序员的时间不是。
答案 2 :(得分:0)
Bundler autoloads / - 需要所有宝石,除非
#Gemfile
gem :somegem, :require => false
然后你可以在需要时提出要求
#some_ruby_file.rb
#within_some_context
require 'somegem'
它是多么有用以及何时执行此操作(除了加载顺序很重要时,对于mocha gem(需要最后加载)),我不知道。我把这留给你自己的判断。