根据数据库内容定义类方法 - 性能

时间:2017-05-19 11:32:43

标签: ruby-on-rails ruby activerecord

在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记录

1 个答案:

答案 0 :(得分:1)

  

在Rails应用程序中哪个更有效/更好

初始化程序选项与您在note中提到的原因相同。由于您的Foo不会发生变化,因此最好先手动初始化它们,而不是每次调用该类时都要随时初始化/定义它们。

避免第一个选项的另一个好理由是,它正在进行数据库调用。假设您在该类中有一个与生成的方法无关的方法,它仍然会定义它们并使您花费数据库事务。

如果它是动态的,那么第一种解决方案会很好。 我处理过类似案件,他们对我很有帮助。

我可以通过initializers解决方案考虑的唯一缺点是您的应用的启动时间。如果foo具有大量列,则在部署/重新启动后,它将在启动时间内添加几秒。我认为可以接受这几秒的时间乘以你对Foo课程的电话数量。

相关问题