mirror of
https://github.com/rails/rails.git
synced 2022-11-09 12:12:34 -05:00
find_or_create_by is deprecated in AR 4
This commit is contained in:
parent
44717a9d54
commit
2565c81862
4 changed files with 10 additions and 35 deletions
|
@ -82,7 +82,7 @@ module ActionController #:nodoc:
|
||||||
# (by name) if it does not already exist, without web-services, it might look like this:
|
# (by name) if it does not already exist, without web-services, it might look like this:
|
||||||
#
|
#
|
||||||
# def create
|
# def create
|
||||||
# @company = Company.find_or_create_by_name(params[:company][:name])
|
# @company = Company.find_or_create_by(name: params[:company][:name])
|
||||||
# @person = @company.people.create(params[:person])
|
# @person = @company.people.create(params[:person])
|
||||||
#
|
#
|
||||||
# redirect_to(person_list_url)
|
# redirect_to(person_list_url)
|
||||||
|
@ -92,7 +92,7 @@ module ActionController #:nodoc:
|
||||||
#
|
#
|
||||||
# def create
|
# def create
|
||||||
# company = params[:person].delete(:company)
|
# company = params[:person].delete(:company)
|
||||||
# @company = Company.find_or_create_by_name(company[:name])
|
# @company = Company.find_or_create_by(name: company[:name])
|
||||||
# @person = @company.people.create(params[:person])
|
# @person = @company.people.create(params[:person])
|
||||||
#
|
#
|
||||||
# respond_to do |format|
|
# respond_to do |format|
|
||||||
|
@ -120,7 +120,7 @@ module ActionController #:nodoc:
|
||||||
# Note, however, the extra bit at the top of that action:
|
# Note, however, the extra bit at the top of that action:
|
||||||
#
|
#
|
||||||
# company = params[:person].delete(:company)
|
# company = params[:person].delete(:company)
|
||||||
# @company = Company.find_or_create_by_name(company[:name])
|
# @company = Company.find_or_create_by(name: company[:name])
|
||||||
#
|
#
|
||||||
# This is because the incoming XML document (if a web-service request is in process) can only contain a
|
# This is because the incoming XML document (if a web-service request is in process) can only contain a
|
||||||
# single root-node. So, we have to rearrange things so that the request looks like this (url-encoded):
|
# single root-node. So, we have to rearrange things so that the request looks like this (url-encoded):
|
||||||
|
|
|
@ -459,7 +459,7 @@ module ActiveRecord
|
||||||
# has_many :people do
|
# has_many :people do
|
||||||
# def find_or_create_by_name(name)
|
# def find_or_create_by_name(name)
|
||||||
# first_name, last_name = name.split(" ", 2)
|
# first_name, last_name = name.split(" ", 2)
|
||||||
# find_or_create_by_first_name_and_last_name(first_name, last_name)
|
# find_or_create_by(first_name: first_name, last_name: last_name)
|
||||||
# end
|
# end
|
||||||
# end
|
# end
|
||||||
# end
|
# end
|
||||||
|
@ -474,7 +474,7 @@ module ActiveRecord
|
||||||
# module FindOrCreateByNameExtension
|
# module FindOrCreateByNameExtension
|
||||||
# def find_or_create_by_name(name)
|
# def find_or_create_by_name(name)
|
||||||
# first_name, last_name = name.split(" ", 2)
|
# first_name, last_name = name.split(" ", 2)
|
||||||
# find_or_create_by_first_name_and_last_name(first_name, last_name)
|
# find_or_create_by(first_name: first_name, last_name: last_name)
|
||||||
# end
|
# end
|
||||||
# end
|
# end
|
||||||
#
|
#
|
||||||
|
|
|
@ -179,23 +179,6 @@ module ActiveRecord #:nodoc:
|
||||||
#
|
#
|
||||||
# Payment.order("created_on").find_by_amount(50)
|
# Payment.order("created_on").find_by_amount(50)
|
||||||
#
|
#
|
||||||
# The same dynamic finder style can be used to create the object if it doesn't already exist.
|
|
||||||
# This dynamic finder is called with <tt>find_or_create_by_</tt> and will return the object if
|
|
||||||
# it already exists and otherwise creates it, then returns it. Protected attributes won't be set
|
|
||||||
# unless they are given in a block.
|
|
||||||
#
|
|
||||||
# # No 'Summer' tag exists
|
|
||||||
# Tag.find_or_create_by_name("Summer") # equal to Tag.create(name: "Summer")
|
|
||||||
#
|
|
||||||
# # Now the 'Summer' tag does exist
|
|
||||||
# Tag.find_or_create_by_name("Summer") # equal to Tag.find_by_name("Summer")
|
|
||||||
#
|
|
||||||
# # Now 'Bob' exist and is an 'admin'
|
|
||||||
# User.find_or_create_by_name('Bob', age: 40) { |u| u.admin = true }
|
|
||||||
#
|
|
||||||
# Adding an exclamation point (!) on to the end of <tt>find_or_create_by_</tt> will
|
|
||||||
# raise an <tt>ActiveRecord::RecordInvalid</tt> error if the new record is invalid.
|
|
||||||
#
|
|
||||||
# Use the <tt>find_or_initialize_by_</tt> finder if you want to return a new record without
|
# Use the <tt>find_or_initialize_by_</tt> finder if you want to return a new record without
|
||||||
# saving it first. Protected attributes won't be set unless they are given in a block.
|
# saving it first. Protected attributes won't be set unless they are given in a block.
|
||||||
#
|
#
|
||||||
|
@ -203,14 +186,6 @@ module ActiveRecord #:nodoc:
|
||||||
# winter = Tag.find_or_initialize_by_name("Winter")
|
# winter = Tag.find_or_initialize_by_name("Winter")
|
||||||
# winter.persisted? # false
|
# winter.persisted? # false
|
||||||
#
|
#
|
||||||
# To find by a subset of the attributes to be used for instantiating a new object, pass a hash instead of
|
|
||||||
# a list of parameters.
|
|
||||||
#
|
|
||||||
# Tag.find_or_create_by_name(name: "rails", creator: current_user)
|
|
||||||
#
|
|
||||||
# That will either find an existing tag named "rails", or create a new one while setting the
|
|
||||||
# user that created it.
|
|
||||||
#
|
|
||||||
# == Saving arrays, hashes, and other non-mappable objects in text columns
|
# == Saving arrays, hashes, and other non-mappable objects in text columns
|
||||||
#
|
#
|
||||||
# Active Record can serialize any object in text columns using YAML. To do so, you must
|
# Active Record can serialize any object in text columns using YAML. To do so, you must
|
||||||
|
|
|
@ -531,7 +531,7 @@ before_save :set_author
|
||||||
|
|
||||||
private
|
private
|
||||||
def set_author
|
def set_author
|
||||||
self.author = User.find_or_create_by_name(author_name)
|
self.author = User.find_or_create_by(name: author_name)
|
||||||
end
|
end
|
||||||
```
|
```
|
||||||
|
|
||||||
|
@ -630,7 +630,7 @@ belongs_to :author, class_name: Blorgh.user_class
|
||||||
The `set_author` method also located in this class should also use this class:
|
The `set_author` method also located in this class should also use this class:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
self.author = Blorgh.user_class.constantize.find_or_create_by_name(author_name)
|
self.author = Blorgh.user_class.constantize.find_or_create_by(name: author_name)
|
||||||
```
|
```
|
||||||
|
|
||||||
To save having to call `constantize` on the `user_class` result all the time, you could instead just override the `user_class` getter method inside the `Blorgh` module in the `lib/blorgh.rb` file to always call `constantize` on the saved value before returning the result:
|
To save having to call `constantize` on the `user_class` result all the time, you could instead just override the `user_class` getter method inside the `Blorgh` module in the `lib/blorgh.rb` file to always call `constantize` on the saved value before returning the result:
|
||||||
|
@ -644,7 +644,7 @@ end
|
||||||
This would then turn the above code for `set_author` into this:
|
This would then turn the above code for `set_author` into this:
|
||||||
|
|
||||||
```ruby
|
```ruby
|
||||||
self.author = Blorgh.user_class.find_or_create_by_name(author_name)
|
self.author = Blorgh.user_class.find_or_create_by(name: author_name)
|
||||||
```
|
```
|
||||||
|
|
||||||
Resulting in something a little shorter, and more implicit in its behaviour. The `user_class` method should always return a `Class` object.
|
Resulting in something a little shorter, and more implicit in its behaviour. The `user_class` method should always return a `Class` object.
|
||||||
|
@ -661,7 +661,7 @@ WARNING: It's very important here to use the `String` version of the class, rath
|
||||||
|
|
||||||
Go ahead and try to create a new post. You will see that it works exactly in the same way as before, except this time the engine is using the configuration setting in `config/initializers/blorgh.rb` to learn what the class is.
|
Go ahead and try to create a new post. You will see that it works exactly in the same way as before, except this time the engine is using the configuration setting in `config/initializers/blorgh.rb` to learn what the class is.
|
||||||
|
|
||||||
There are now no strict dependencies on what the class is, only what the API for the class must be. The engine simply requires this class to define a `find_or_create_by_name` method which returns an object of that class to be associated with a post when it's created. This object, of course, should have some sort of identifier by which it can be referenced.
|
There are now no strict dependencies on what the class is, only what the API for the class must be. The engine simply requires this class to define a `find_or_create_by` method which returns an object of that class to be associated with a post when it's created. This object, of course, should have some sort of identifier by which it can be referenced.
|
||||||
|
|
||||||
#### General engine configuration
|
#### General engine configuration
|
||||||
|
|
||||||
|
@ -800,7 +800,7 @@ module Blorgh::Concerns::Models::Post
|
||||||
private
|
private
|
||||||
|
|
||||||
def set_author
|
def set_author
|
||||||
self.author = User.find_or_create_by_name(author_name)
|
self.author = User.find_or_create_by(name: author_name)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue