Railsがロードされている間に複数のインスタンスを作成しようとしています。 (私はYAMLファイルからデータをロードしていますが、この質問の詳細を抽象化しています)。データをロードするinstantiate
クラスメソッドを持つ非ActiveRecordモデルがあります。私がinstantiate
をconfig.after_initialize
から、そして/またはカスタムイニシャライザから呼び出すと、インスタンスが作成されますが、rails console
のロードが完了するまでには、それらはなくなります。データをインスタンス化して、レールコンソール(およびサーバー)内で使用できるようにするにはどうすればよいですか?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