我試圖在Rails加載時創建一個類的多個實例,並保持這些實例可用。 (我從YAML文件加載數據,但是我已經抽象出這個問題的詳細信息。)我有一個非ActiveRecord模型,其中有一個instantiate
類加載數據的方法。當我從config.after_initialize
和/或從自定義初始值設定項中調用instantiate
時,將創建實例,但到rails console
完成加載時,它們消失。我可以在哪裏實例化數據,以便它可以在rails控制檯(和服務器)中使用?在Rails啓動過程中創建一個類的實例
# app/models/test.rb
class Test
include ActiveModel::Model
attr_accessor :name
class << self
include Enumerable
def each
ObjectSpace.each_object(self).each do |object|
yield object
end
self
end
def find_by_name(input)
find { |object| object.name.to_s == input.to_s }
end
def instantiate
new(name: 'Alice')
new(name: 'Bob')
end
end
def initialize(*parameters)
super(*parameters)
freeze
end
delegate :to_s, to: :name
end
# config/application.rb
module MyApp
class Application < Rails::Application
config.after_initialize do
p "Test instances before after_initialize: #{Test.count}"
Test.instantiate
p "Test instances after after_initialize: #{Test.count}"
end
end
end
# config/initializer/test_initializer.rb
p "Test instances before test_initializer: #{Test.count}"
Test.instantiate
p "Test instances after test_initializer: #{Test.count}"
$ rails console
"Test instances before test_initializer: 2"
"Test instances after test_initializer: 4"
"Test instances before after_initialize: 0"
"Test instances after after_initialize: 2"
Loading development environment (Rails 4.2.6)
irb(main):001:0> Test.count
=> 0
irb(main):002:0> Test.instantiate
=> #<Test:0x007fad2204d8b0 @name="Bob">
irb(main):003:0> Test.count
=> 2
謝謝。請參閱我修改的答案,瞭解我如何重複您的建議。 – dankohn