rails 4.2.0.beta1 → 4.2.0.beta2

Sign up to get free protection for your applications and to get access to all the features.
Files changed (37) hide show
  1. checksums.yaml +4 -4
  2. data/guides/rails_guides/markdown.rb +6 -1
  3. data/guides/source/2_2_release_notes.md +1 -1
  4. data/guides/source/2_3_release_notes.md +1 -1
  5. data/guides/source/3_0_release_notes.md +2 -2
  6. data/guides/source/3_1_release_notes.md +4 -1
  7. data/guides/source/3_2_release_notes.md +4 -1
  8. data/guides/source/4_0_release_notes.md +4 -1
  9. data/guides/source/4_1_release_notes.md +4 -4
  10. data/guides/source/4_2_release_notes.md +272 -45
  11. data/guides/source/action_controller_overview.md +3 -3
  12. data/guides/source/action_mailer_basics.md +28 -4
  13. data/guides/source/action_view_overview.md +11 -11
  14. data/guides/source/active_job_basics.md +99 -63
  15. data/guides/source/active_record_postgresql.md +2 -1
  16. data/guides/source/active_record_querying.md +7 -9
  17. data/guides/source/active_support_core_extensions.md +48 -2
  18. data/guides/source/asset_pipeline.md +200 -18
  19. data/guides/source/association_basics.md +8 -8
  20. data/guides/source/caching_with_rails.md +1 -1
  21. data/guides/source/command_line.md +1 -1
  22. data/guides/source/configuring.md +7 -7
  23. data/guides/source/contributing_to_ruby_on_rails.md +17 -0
  24. data/guides/source/debugging_rails_applications.md +2 -2
  25. data/guides/source/development_dependencies_install.md +41 -43
  26. data/guides/source/form_helpers.md +17 -17
  27. data/guides/source/generators.md +6 -2
  28. data/guides/source/getting_started.md +1 -1
  29. data/guides/source/i18n.md +16 -0
  30. data/guides/source/initialization.md +0 -2
  31. data/guides/source/layouts_and_rendering.md +2 -1
  32. data/guides/source/maintenance_policy.md +6 -3
  33. data/guides/source/nested_model_forms.md +4 -1
  34. data/guides/source/routing.md +1 -1
  35. data/guides/source/testing.md +2 -2
  36. data/guides/source/upgrading_ruby_on_rails.md +94 -23
  37. metadata +18 -18
@@ -1183,9 +1183,9 @@ First define your app own routes to display the errors page.
1183
1183
  * `config/routes.rb`
1184
1184
 
1185
1185
  ```ruby
1186
- get '/404', to: 'errors#not_found'
1187
- get '/422', to: 'errors#unprocessable_entity'
1188
- get '/500', to: 'errors#server_error'
1186
+ match '/404', via: :all, to: 'errors#not_found'
1187
+ match '/422', via: :all, to: 'errors#unprocessable_entity'
1188
+ match '/500', via: :all, to: 'errors#server_error'
1189
1189
  ```
1190
1190
 
1191
1191
  Create the controller and views.
@@ -159,7 +159,10 @@ $ bin/rake db:migrate
159
159
  Now that we have a user model to play with, we will just edit the
160
160
  `app/controllers/users_controller.rb` make it instruct the `UserMailer` to deliver
161
161
  an email to the newly created user by editing the create action and inserting a
162
- call to `UserMailer.welcome_email` right after the user is successfully saved:
162
+ call to `UserMailer.welcome_email` right after the user is successfully saved.
163
+
164
+ Action Mailer is nicely integrated with Active Job so you can send emails outside
165
+ of the request-response cycle, so the user doesn't have to wait on it:
163
166
 
164
167
  ```ruby
165
168
  class UsersController < ApplicationController
@@ -171,7 +174,7 @@ class UsersController < ApplicationController
171
174
  respond_to do |format|
172
175
  if @user.save
173
176
  # Tell the UserMailer to send a welcome email after save
174
- UserMailer.welcome_email(@user).deliver
177
+ UserMailer.welcome_email(@user).deliver_later
175
178
 
176
179
  format.html { redirect_to(@user, notice: 'User was successfully created.') }
177
180
  format.json { render json: @user, status: :created, location: @user }
@@ -184,8 +187,29 @@ class UsersController < ApplicationController
184
187
  end
185
188
  ```
186
189
 
187
- The method `welcome_email` returns a `Mail::Message` object which can then just
188
- be told `deliver` to send itself out.
190
+ NOTE: Active Job's default behavior is to execute jobs ':inline'. So, you can use
191
+ `deliver_later` now to send emails, and when you later decide to start sending
192
+ them from a background job, you'll only need to set up Active Job to use a queueing
193
+ backend (Sidekiq, Resque, etc).
194
+
195
+ If you want to send emails right away (from a cronjob for example) just call
196
+ `deliver_now`:
197
+
198
+ ```ruby
199
+ class SendWeeklySummary
200
+ def run
201
+ User.find_each do |user|
202
+ UserMailer.weekly_summary(user).deliver_now
203
+ end
204
+ end
205
+ end
206
+ ```
207
+
208
+ The method `welcome_email` returns a `ActionMailer::MessageDelivery` object which
209
+ can then just be told `deliver_now` or `deliver_later` to send itself out. The
210
+ `ActionMailer::MessageDelivery` object is just a wrapper around a `Mail::Message`. If
211
+ you want to inspect, alter or do anything else with the `Mail::Message` object you can
212
+ access it with the `message` method on the `ActionMailer::MessageDelivery` object.
189
213
 
190
214
  ### Auto encoding header values
191
215
 
@@ -44,18 +44,18 @@ $ bin/rails generate scaffold article
44
44
 
45
45
  There is a naming convention for views in Rails. Typically, the views share their name with the associated controller action, as you can see above.
46
46
  For example, the index controller action of the `articles_controller.rb` will use the `index.html.erb` view file in the `app/views/articles` directory.
47
- The complete HTML returned to the client is composed of a combination of this ERB file, a layout template that wraps it, and all the partials that the view may reference. Later on this guide you can find a more detailed documentation of each one of these three components.
47
+ The complete HTML returned to the client is composed of a combination of this ERB file, a layout template that wraps it, and all the partials that the view may reference. Within this guide you will find more detailed documentation about each of these three components.
48
48
 
49
49
 
50
50
  Templates, Partials and Layouts
51
51
  -------------------------------
52
52
 
53
- As mentioned before, the final HTML output is a composition of three Rails elements: `Templates`, `Partials` and `Layouts`.
54
- Below is a brief overview of each one of them.
53
+ As mentioned, the final HTML output is a composition of three Rails elements: `Templates`, `Partials` and `Layouts`.
54
+ Below is a brief overview of each of them.
55
55
 
56
56
  ### Templates
57
57
 
58
- Action View templates can be written in several ways. If the template file has a `.erb` extension then it uses a mixture of ERB (included in Ruby) and HTML. If the template file has a `.builder` extension then a fresh instance of `Builder::XmlMarkup` library is used.
58
+ Action View templates can be written in several ways. If the template file has a `.erb` extension then it uses a mixture of ERB (Embedded Ruby) and HTML. If the template file has a `.builder` extension then the `Builder::XmlMarkup` library is used.
59
59
 
60
60
  Rails supports multiple template systems and uses a file extension to distinguish amongst them. For example, an HTML file using the ERB template system will have `.html.erb` as a file extension.
61
61
 
@@ -72,7 +72,7 @@ Consider the following loop for names:
72
72
  <% end %>
73
73
  ```
74
74
 
75
- The loop is set up in regular embedding tags (`<% %>`) and the name is written using the output embedding tags (`<%= %>`). Note that this is not just a usage suggestion, for regular output functions like `print` or `puts` won't work with ERB templates. So this would be wrong:
75
+ The loop is set up using regular embedding tags (`<% %>`) and the name is inserted using the output embedding tags (`<%= %>`). Note that this is not just a usage suggestion: regular output functions such as `print` and `puts` won't be rendered to the view with ERB templates. So this would be wrong:
76
76
 
77
77
  ```html+erb
78
78
  <%# WRONG %>
@@ -231,7 +231,7 @@ The `object` and `as` options can also be used together:
231
231
 
232
232
  #### Rendering Collections
233
233
 
234
- It is very common that a template needs to iterate over a collection and render a sub-template for each of the elements. This pattern has been implemented as a single method that accepts an array and renders a partial for each one of the elements in the array.
234
+ It is very common that a template will need to iterate over a collection and render a sub-template for each of the elements. This pattern has been implemented as a single method that accepts an array and renders a partial for each one of the elements in the array.
235
235
 
236
236
  So this example for rendering all the products:
237
237
 
@@ -247,7 +247,7 @@ can be rewritten in a single line:
247
247
  <%= render partial: "product", collection: @products %>
248
248
  ```
249
249
 
250
- When a partial is called like this (eg. with a collection), the individual instances of the partial have access to the member of the collection being rendered via a variable named after the partial. In this case, the partial is `_product`, and within it you can refer to `product` to get the instance that is being rendered.
250
+ When a partial is called with a collection, the individual instances of the partial have access to the member of the collection being rendered via a variable named after the partial. In this case, the partial is `_product`, and within it you can refer to `product` to get the collection member that is being rendered.
251
251
 
252
252
  You can use a shorthand syntax for rendering collections. Assuming `@products` is a collection of `Product` instances, you can simply write the following to produce the same result:
253
253
 
@@ -255,7 +255,7 @@ You can use a shorthand syntax for rendering collections. Assuming `@products` i
255
255
  <%= render @products %>
256
256
  ```
257
257
 
258
- Rails determines the name of the partial to use by looking at the model name in the collection, `Product` in this case. In fact, you can even create a heterogeneous collection and render it this way, and Rails will choose the proper partial for each member of the collection.
258
+ Rails determines the name of the partial to use by looking at the model name in the collection, `Product` in this case. In fact, you can even render a collection made up of instances of different models using this shorthand, and Rails will choose the proper partial for each member of the collection.
259
259
 
260
260
  #### Spacer Templates
261
261
 
@@ -269,14 +269,14 @@ Rails will render the `_product_ruler` partial (with no data passed to it) betwe
269
269
 
270
270
  ### Layouts
271
271
 
272
- Layouts can be used to render a common view template around the results of Rails controller actions. Typically, every Rails application has a couple of overall layouts that most pages are rendered within. For example, a site might have a layout for a logged in user, and a layout for the marketing or sales side of the site. The logged in user layout might include top-level navigation that should be present across many controller actions. The sales layout for a SaaS app might include top-level navigation for things like "Pricing" and "Contact Us." You would expect each layout to have a different look and feel. You can read more details about Layouts in the [Layouts and Rendering in Rails](layouts_and_rendering.html) guide.
272
+ Layouts can be used to render a common view template around the results of Rails controller actions. Typically, a Rails application will have a couple of layouts that pages will be rendered within. For example, a site might have one layout for a logged in user and another for the marketing or sales side of the site. The logged in user layout might include top-level navigation that should be present across many controller actions. The sales layout for a SaaS app might include top-level navigation for things like "Pricing" and "Contact Us" pages. You would expect each layout to have a different look and feel. You can read about layouts in more detail in the [Layouts and Rendering in Rails](layouts_and_rendering.html) guide.
273
273
 
274
274
  Partial Layouts
275
275
  ---------------
276
276
 
277
- Partials can have their own layouts applied to them. These layouts are different than the ones that are specified globally for the entire action, but they work in a similar fashion.
277
+ Partials can have their own layouts applied to them. These layouts are different from those applied to a controller action, but they work in a similar fashion.
278
278
 
279
- Let's say we're displaying an article on a page, that should be wrapped in a `div` for display purposes. First, we'll create a new `Article`:
279
+ Let's say we're displaying an article on a page which should be wrapped in a `div` for display purposes. Firstly, we'll create a new `Article`:
280
280
 
281
281
  ```ruby
282
282
  Article.create(body: 'Partial Layouts are cool!')
@@ -13,12 +13,13 @@ After reading this guide, you will know:
13
13
 
14
14
  --------------------------------------------------------------------------------
15
15
 
16
+
16
17
  Introduction
17
18
  ------------
18
19
 
19
20
  Active Job is a framework for declaring jobs and making them run on a variety
20
21
  of queueing backends. These jobs can be everything from regularly scheduled
21
- clean-ups, billing charges, or mailings. Anything that can be chopped up
22
+ clean-ups, to billing charges, to mailings. Anything that can be chopped up
22
23
  into small units of work and run in parallel, really.
23
24
 
24
25
 
@@ -35,12 +36,12 @@ then. And you'll be able to switch between them without having to rewrite your j
35
36
  Creating a Job
36
37
  --------------
37
38
 
38
- This section will provide a step-by-step guide to creating a job and enqueue it.
39
+ This section will provide a step-by-step guide to creating a job and enqueuing it.
39
40
 
40
41
  ### Create the Job
41
42
 
42
43
  Active Job provides a Rails generator to create jobs. The following will create a
43
- job in app/jobs:
44
+ job in `app/jobs`:
44
45
 
45
46
  ```bash
46
47
  $ bin/rails generate job guests_cleanup
@@ -58,15 +59,15 @@ As you can see, you can generate jobs just like you use other generators with
58
59
  Rails.
59
60
 
60
61
  If you don't want to use a generator, you could create your own file inside of
61
- app/jobs, just make sure that it inherits from `ActiveJob::Base`.
62
+ `app/jobs`, just make sure that it inherits from `ActiveJob::Base`.
62
63
 
63
- Here's how a job looks like:
64
+ Here's what a job looks like:
64
65
 
65
66
  ```ruby
66
67
  class GuestsCleanupJob < ActiveJob::Base
67
68
  queue_as :default
68
69
 
69
- def perform
70
+ def perform(*args)
70
71
  # Do something later
71
72
  end
72
73
  end
@@ -77,15 +78,15 @@ end
77
78
  Enqueue a job like so:
78
79
 
79
80
  ```ruby
80
- MyJob.enqueue record # Enqueue a job to be performed as soon the queueing system is free.
81
+ MyJob.perform_later record # Enqueue a job to be performed as soon the queueing system is free.
81
82
  ```
82
83
 
83
84
  ```ruby
84
- MyJob.enqueue_at Date.tomorrow.noon, record # Enqueue a job to be performed tomorrow at noon.
85
+ MyJob.set(wait_until: Date.tomorrow.noon).perform_later(record) # Enqueue a job to be performed tomorrow at noon.
85
86
  ```
86
87
 
87
88
  ```ruby
88
- MyJob.enqueue_in 1.week, record # Enqueue a job to be performed 1 week from now.
89
+ MyJob.set(wait: 1.week).perform_later(record) # Enqueue a job to be performed 1 week from now.
89
90
  ```
90
91
 
91
92
  That's it!
@@ -94,52 +95,30 @@ That's it!
94
95
  Job Execution
95
96
  -------------
96
97
 
97
- If not adapter is set, the job is immediately executed.
98
+ If no adapter is set, the job is immediately executed.
98
99
 
99
100
  ### Backends
100
101
 
101
- Active Job has adapters for the following queueing backends:
102
-
103
- * [Backburner](https://github.com/nesquena/backburner)
104
- * [Delayed Job](https://github.com/collectiveidea/delayed_job)
105
- * [Qu](https://github.com/bkeepers/qu)
106
- * [Que](https://github.com/chanks/que)
107
- * [QueueClassic](https://github.com/ryandotsmith/queue_classic)
108
- * [Resque 1.x](https://github.com/resque/resque)
109
- * [Sidekiq](https://github.com/mperham/sidekiq)
110
- * [Sneakers](https://github.com/jondot/sneakers)
111
- * [Sucker Punch](https://github.com/brandonhilkert/sucker_punch)
112
-
113
- #### Backends Features
114
-
115
- | | Async | Queues | Delayed | Priorities | Timeout | Retries |
116
- |-----------------------|-------|---------|---------|-------------|---------|---------|
117
- | **Backburner** | Yes | Yes | Yes | Yes | Job | Global |
118
- | **Delayed Job** | Yes | Yes | Yes | Job | Global | Global |
119
- | **Que** | Yes | Yes | Yes | Job | No | Job |
120
- | **Queue Classic** | Yes | Yes | Gem | No | No | No |
121
- | **Resque** | Yes | Yes | Gem | Queue | Global | ? |
122
- | **Sidekiq** | Yes | Yes | Yes | Queue | No | Job |
123
- | **Sneakers** | Yes | Yes | No | Queue | Queue | No |
124
- | **Sucker Punch** | Yes | Yes | Yes | No | No | No |
125
- | **Active Job** | Yes | Yes | WIP | No | No | No |
126
- | **Active Job Inline** | No | Yes | N/A | N/A | N/A | N/A |
127
-
128
- ### Change Backends
129
-
130
- You can easy change your adapter:
102
+ Active Job has built-in adapters for multiple queueing backends (Sidekiq,
103
+ Resque, Delayed Job and others). To get an up-to-date list of the adapters
104
+ see the API Documentation for [ActiveJob::QueueAdapters](http://api.rubyonrails.org/classes/ActiveJob/QueueAdapters.html).
105
+
106
+ ### Changing the Backend
107
+
108
+ You can easily change your queueing backend:
131
109
 
132
110
  ```ruby
133
111
  # be sure to have the adapter gem in your Gemfile and follow the adapter specific
134
112
  # installation and deployment instructions
135
- YourApp::Application.config.active_job.queue_adapter = :sidekiq
113
+ Rails.application.config.active_job.queue_adapter = :sidekiq
136
114
  ```
137
115
 
116
+
138
117
  Queues
139
118
  ------
140
119
 
141
- Most of the adapters supports multiple queues. With Active Job you can schedule the job
142
- to run on a specific queue:
120
+ Most of the adapters support multiple queues. With Active Job you can schedule
121
+ the job to run on a specific queue:
143
122
 
144
123
  ```ruby
145
124
  class GuestsCleanupJob < ActiveJob::Base
@@ -148,24 +127,77 @@ class GuestsCleanupJob < ActiveJob::Base
148
127
  end
149
128
  ```
150
129
 
151
- NOTE: Make sure your queueing backend "listens" on your queue name. For some backends
152
- you need to specify the queues to listen to.
130
+ You can prefix the queue name for all your jobs using
131
+ `config.active_job.queue_name_prefix` in `application.rb`:
132
+
133
+ ```ruby
134
+ # config/application.rb
135
+ module YourApp
136
+ class Application < Rails::Application
137
+ config.active_job.queue_name_prefix = Rails.env
138
+ end
139
+ end
140
+
141
+ # app/jobs/guests_cleanup.rb
142
+ class GuestsCleanupJob < ActiveJob::Base
143
+ queue_as :low_priority
144
+ #....
145
+ end
146
+
147
+ # Now your job will run on queue production_low_priority on your
148
+ # production environment and on beta_low_priority on your beta
149
+ # environment
150
+ ```
151
+
152
+ If you want more control on what queue a job will be run you can pass a :queue
153
+ option to #set:
154
+
155
+ ```ruby
156
+ MyJob.set(queue: :another_queue).perform_later(record)
157
+ ```
158
+
159
+ To control the queue from the job level you can pass a block to queue_as. The
160
+ block will be executed in the job context (so you can access self.arguments)
161
+ and you must return the queue name:
162
+
163
+ ```ruby
164
+ class ProcessVideoJob < ActiveJob::Base
165
+ queue_as do
166
+ video = self.arguments.first
167
+ if video.owner.premium?
168
+ :premium_videojobs
169
+ else
170
+ :videojobs
171
+ end
172
+ end
173
+
174
+ def perform(video)
175
+ # do process video
176
+ end
177
+ end
178
+
179
+ ProcessVideoJob.perform_later(Video.last)
180
+ ```
181
+
182
+
183
+ NOTE: Make sure your queueing backend "listens" on your queue name. For some
184
+ backends you need to specify the queues to listen to.
153
185
 
154
186
 
155
187
  Callbacks
156
188
  ---------
157
189
 
158
- Active Job provides hooks during the lifecycle of a job. Callbacks allows you to trigger
159
- logic during the lifecycle of a job.
190
+ Active Job provides hooks during the lifecycle of a job. Callbacks allow you to
191
+ trigger logic during the lifecycle of a job.
160
192
 
161
193
  ### Available callbacks
162
194
 
163
- * before_enqueue
164
- * around_enqueue
165
- * after_enqueue
166
- * before_perform
167
- * around_perform
168
- * after_perform
195
+ * `before_enqueue`
196
+ * `around_enqueue`
197
+ * `after_enqueue`
198
+ * `before_perform`
199
+ * `around_perform`
200
+ * `after_perform`
169
201
 
170
202
  ### Usage
171
203
 
@@ -174,7 +206,7 @@ class GuestsCleanupJob < ActiveJob::Base
174
206
  queue_as :default
175
207
 
176
208
  before_enqueue do |job|
177
- # do somthing with the job instance
209
+ # do something with the job instance
178
210
  end
179
211
 
180
212
  around_perform do |job, block|
@@ -189,25 +221,28 @@ class GuestsCleanupJob < ActiveJob::Base
189
221
  end
190
222
  ```
191
223
 
224
+
192
225
  ActionMailer
193
226
  ------------
227
+
194
228
  One of the most common jobs in a modern web application is sending emails outside
195
229
  of the request-response cycle, so the user doesn't have to wait on it. Active Job
196
- is integrated with Action Mailer so you can easily send emails async:
230
+ is integrated with Action Mailer so you can easily send emails asynchronously:
197
231
 
198
232
  ```ruby
199
- # Instead of the classic
200
- UserMailer.welcome(@user).deliver
233
+ # If you want to send the email now use #deliver_now
234
+ UserMailer.welcome(@user).deliver_now
201
235
 
202
- # use #deliver later to send the email async
236
+ # If you want to send the email through Active Job use #deliver_later
203
237
  UserMailer.welcome(@user).deliver_later
204
238
  ```
205
239
 
240
+
206
241
  GlobalID
207
242
  --------
208
- Active Job supports GlobalID for parameters. This makes it possible
209
- to pass live Active Record objects to your job instead of class/id pairs, which
210
- you then have to manually deserialize. Before, jobs would look like this:
243
+ Active Job supports GlobalID for parameters. This makes it possible to pass live
244
+ Active Record objects to your job instead of class/id pairs, which you then have
245
+ to manually deserialize. Before, jobs would look like this:
211
246
 
212
247
  ```ruby
213
248
  class TrashableCleanupJob
@@ -228,12 +263,13 @@ class TrashableCleanupJob
228
263
  end
229
264
  ```
230
265
 
231
- This works with any class that mixes in ActiveModel::GlobalIdentification, which
266
+ This works with any class that mixes in `ActiveModel::GlobalIdentification`, which
232
267
  by default has been mixed into Active Model classes.
233
268
 
234
269
 
235
270
  Exceptions
236
271
  ----------
272
+
237
273
  Active Job provides a way to catch exceptions raised during the execution of the
238
274
  job:
239
275
 
@@ -242,7 +278,7 @@ job:
242
278
  class GuestsCleanupJob < ActiveJob::Base
243
279
  queue_as :default
244
280
 
245
- rescue_from(ActiveRecord:NotFound) do |exception|
281
+ rescue_from(ActiveRecord::RecordNotFound) do |exception|
246
282
  # do something with the exception
247
283
  end
248
284
 
@@ -132,7 +132,8 @@ event = Event.first
132
132
  event.payload # => {"kind"=>"user_renamed", "change"=>["jack", "john"]}
133
133
 
134
134
  ## Query based on JSON document
135
- Event.where("payload->'kind' = ?", "user_renamed")
135
+ # The -> operator returns the original JSON type (which might be an object), whereas ->> returns text
136
+ Event.where("payload->>'kind' = ?", "user_renamed")
136
137
  ```
137
138
 
138
139
  ### Range Types
@@ -276,7 +276,7 @@ This may appear straightforward:
276
276
  ```ruby
277
277
  # This is very inefficient when the users table has thousands of rows.
278
278
  User.all.each do |user|
279
- NewsMailer.weekly(user).deliver
279
+ NewsMailer.weekly(user).deliver_now
280
280
  end
281
281
  ```
282
282
 
@@ -292,7 +292,7 @@ The `find_each` method retrieves a batch of records and then yields _each_ recor
292
292
 
293
293
  ```ruby
294
294
  User.find_each do |user|
295
- NewsMailer.weekly(user).deliver
295
+ NewsMailer.weekly(user).deliver_now
296
296
  end
297
297
  ```
298
298
 
@@ -300,7 +300,7 @@ To add conditions to a `find_each` operation you can chain other Active Record m
300
300
 
301
301
  ```ruby
302
302
  User.where(weekly_subscriber: true).find_each do |user|
303
- NewsMailer.weekly(user).deliver
303
+ NewsMailer.weekly(user).deliver_now
304
304
  end
305
305
  ```
306
306
 
@@ -316,7 +316,7 @@ The `:batch_size` option allows you to specify the number of records to be retri
316
316
 
317
317
  ```ruby
318
318
  User.find_each(batch_size: 5000) do |user|
319
- NewsMailer.weekly(user).deliver
319
+ NewsMailer.weekly(user).deliver_now
320
320
  end
321
321
  ```
322
322
 
@@ -328,7 +328,7 @@ For example, to send newsletters only to users with the primary key starting fro
328
328
 
329
329
  ```ruby
330
330
  User.find_each(start: 2000, batch_size: 5000) do |user|
331
- NewsMailer.weekly(user).deliver
331
+ NewsMailer.weekly(user).deliver_now
332
332
  end
333
333
  ```
334
334
 
@@ -340,16 +340,14 @@ The `find_in_batches` method is similar to `find_each`, since both retrieve batc
340
340
 
341
341
  ```ruby
342
342
  # Give add_invoices an array of 1000 invoices at a time
343
- Invoice.find_in_batches(include: :invoice_lines) do |invoices|
343
+ Invoice.find_in_batches do |invoices|
344
344
  export.add_invoices(invoices)
345
345
  end
346
346
  ```
347
347
 
348
- NOTE: The `:include` option allows you to name associations that should be loaded alongside with the models.
349
-
350
348
  ##### Options for `find_in_batches`
351
349
 
352
- The `find_in_batches` method accepts the same `:batch_size` and `:start` options as `find_each`, as well as most of the options allowed by the regular `find` method, except for `:order` and `:limit`, which are reserved for internal use by `find_in_batches`.
350
+ The `find_in_batches` method accepts the same `:batch_size` and `:start` options as `find_each`.
353
351
 
354
352
  Conditions
355
353
  ----------