Skip to content

Commit 0627442

Browse files
authored
Merge pull request rails#33959 from eugeneius/eager_load_attribute_methods
Eagerly define attribute methods in production
2 parents d03cc17 + 3b95478 commit 0627442

File tree

2 files changed

+55
-0
lines changed

2 files changed

+55
-0
lines changed

activerecord/lib/active_record/railtie.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -137,6 +137,14 @@ class Railtie < Rails::Railtie # :nodoc:
137137
end
138138
end
139139

140+
initializer "active_record.define_attribute_methods" do |app|
141+
config.after_initialize do
142+
ActiveSupport.on_load(:active_record) do
143+
descendants.each(&:define_attribute_methods) if app.config.eager_load
144+
end
145+
end
146+
end
147+
140148
initializer "active_record.warn_on_records_fetched_greater_than" do
141149
if config.active_record.warn_on_records_fetched_greater_than
142150
ActiveSupport.on_load(:active_record) do

railties/test/application/configuration_test.rb

Lines changed: 47 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -310,6 +310,53 @@ def noop_email;end
310310
assert_equal %w(noop_email).to_set, PostsMailer.instance_variable_get(:@action_methods)
311311
end
312312

313+
test "does not eager load attribute methods in development" do
314+
app_file "app/models/post.rb", <<-RUBY
315+
class Post < ActiveRecord::Base
316+
end
317+
RUBY
318+
319+
app_file "config/initializers/active_record.rb", <<-RUBY
320+
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
321+
ActiveRecord::Migration.verbose = false
322+
ActiveRecord::Schema.define(version: 1) do
323+
create_table :posts do |t|
324+
t.string :title
325+
end
326+
end
327+
RUBY
328+
329+
app "development"
330+
331+
assert_not_includes Post.instance_methods, :title
332+
end
333+
334+
test "eager loads attribute methods in production" do
335+
app_file "app/models/post.rb", <<-RUBY
336+
class Post < ActiveRecord::Base
337+
end
338+
RUBY
339+
340+
app_file "config/initializers/active_record.rb", <<-RUBY
341+
ActiveRecord::Base.establish_connection(adapter: "sqlite3", database: ":memory:")
342+
ActiveRecord::Migration.verbose = false
343+
ActiveRecord::Schema.define(version: 1) do
344+
create_table :posts do |t|
345+
t.string :title
346+
end
347+
end
348+
RUBY
349+
350+
add_to_config <<-RUBY
351+
config.eager_load = true
352+
config.cache_classes = true
353+
RUBY
354+
355+
app "production"
356+
357+
assert_includes Post.instance_methods, :title
358+
end
359+
313360
test "initialize an eager loaded, cache classes app" do
314361
add_to_config <<-RUBY
315362
config.eager_load = true

0 commit comments

Comments
 (0)