在Rails应用程序中哪个更有效/更好:
class Foo < ApplicationRecord
Foo.pluck(:name).each do |name|
define_singleton_method(name) { Foo.find_by(name: name) }
end
end
或在初始化程序(config/initializers/foo.rb
)中运行代码:
Foo.pluck(:name).each do |name|
Foo.define_singleton_method(name) { Foo.find_by(name: name) }
end
或者别的什么?
注意:Foo
实例仅在初始化程序中创建一次。它们不会被应用程序中的任何用户更改。
我这样做是为了避免写作
def self.bar
find_by(name: 'bar')
end
每个Foo
记录。
答案 0 :(得分:1)
在Rails应用程序中哪个更有效/更好
初始化程序选项与您在note
中提到的原因相同。由于您的Foo
不会发生变化,因此最好先手动初始化它们,而不是每次调用该类时都要随时初始化/定义它们。
避免第一个选项的另一个好理由是,它正在进行数据库调用。假设您在该类中有一个与生成的方法无关的方法,它仍然会定义它们并使您花费数据库事务。
如果它是动态的,那么第一种解决方案会很好。 我处理过类似案件,他们对我很有帮助。
我可以通过initializers
解决方案考虑的唯一缺点是您的应用的启动时间。如果foo
具有大量列,则在部署/重新启动后,它将在启动时间内添加几秒。我认为可以接受这几秒的时间乘以你对Foo
课程的电话数量。