aboutsummaryrefslogtreecommitdiffstats
path: root/activerecord
diff options
context:
space:
mode:
authorVijay Dev <vijaydev.cse@gmail.com>2012-09-28 23:17:07 +0530
committerVijay Dev <vijaydev.cse@gmail.com>2012-09-28 23:17:07 +0530
commit955a72c692a4298d238cc2e6353b9874099203f1 (patch)
tree2a05fecd15526cd0013c22e45825be1aca4844d9 /activerecord
parent77fbe1c0199567486c422fdf5cce49f2c11fc953 (diff)
parentcf3e760b87c49470c9a26ab3e2da67602474be1f (diff)
downloadrails-955a72c692a4298d238cc2e6353b9874099203f1.tar.gz
rails-955a72c692a4298d238cc2e6353b9874099203f1.tar.bz2
rails-955a72c692a4298d238cc2e6353b9874099203f1.zip
Merge branch 'master' of github.com:lifo/docrails
Conflicts: actionpack/lib/action_view/helpers/asset_tag_helper.rb
Diffstat (limited to 'activerecord')
-rw-r--r--activerecord/lib/active_record/associations/collection_proxy.rb32
-rw-r--r--activerecord/lib/active_record/attribute_methods/dirty.rb8
-rw-r--r--activerecord/lib/active_record/attribute_methods/primary_key.rb26
-rw-r--r--activerecord/lib/active_record/attribute_methods/read.rb12
-rw-r--r--activerecord/lib/active_record/attribute_methods/serialization.rb19
-rw-r--r--activerecord/lib/active_record/attribute_methods/write.rb5
-rw-r--r--activerecord/lib/active_record/coders/yaml_column.rb6
-rw-r--r--activerecord/lib/active_record/fixtures/file.rb2
-rw-r--r--activerecord/lib/active_record/model.rb7
-rw-r--r--activerecord/lib/active_record/railtie.rb4
-rw-r--r--activerecord/lib/active_record/railties/controller_runtime.rb4
-rw-r--r--activerecord/lib/active_record/scoping/default.rb55
-rw-r--r--activerecord/lib/active_record/scoping/named.rb113
-rw-r--r--activerecord/lib/active_record/validations.rb23
-rw-r--r--activerecord/lib/active_record/validations/associated.rb2
-rw-r--r--activerecord/lib/active_record/validations/presence.rb17
-rw-r--r--activerecord/lib/active_record/validations/uniqueness.rb12
17 files changed, 161 insertions, 186 deletions
diff --git a/activerecord/lib/active_record/associations/collection_proxy.rb b/activerecord/lib/active_record/associations/collection_proxy.rb
index c113957faa..e73f940334 100644
--- a/activerecord/lib/active_record/associations/collection_proxy.rb
+++ b/activerecord/lib/active_record/associations/collection_proxy.rb
@@ -42,11 +42,15 @@ module ActiveRecord
@association.load_target
end
+ # Returns +true+ if the association has been loaded, otherwise +false+.
+ #
+ # person.pets.loaded? # => false
+ # person.pets
+ # person.pets.loaded? # => true
def loaded?
@association.loaded?
end
- ##
# Works in two ways.
#
# *First:* Specify a subset of fields to be selected from the result set.
@@ -104,9 +108,8 @@ module ActiveRecord
@association.select(select, &block)
end
- ##
# Finds an object in the collection responding to the +id+. Uses the same
- # rules as +ActiveRecord::Base.find+. Returns +ActiveRecord::RecordNotFound++
+ # rules as <tt>ActiveRecord::Base.find</tt>. Returns <tt>ActiveRecord::RecordNotFound</tt>
# error if the object can not be found.
#
# class Person < ActiveRecord::Base
@@ -135,7 +138,6 @@ module ActiveRecord
@association.find(*args, &block)
end
- ##
# Returns the first record, or the first +n+ records, from the collection.
# If the collection is empty, the first form returns +nil+, and the second
# form returns an empty array.
@@ -166,7 +168,6 @@ module ActiveRecord
@association.first(*args)
end
- ##
# Returns the last record, or the last +n+ records, from the collection.
# If the collection is empty, the first form returns +nil+, and the second
# form returns an empty array.
@@ -197,7 +198,6 @@ module ActiveRecord
@association.last(*args)
end
- ##
# Returns a new object of the collection type that has been instantiated
# with +attributes+ and linked to this object, but have not yet been saved.
# You can pass an array of attributes hashes, this will return an array
@@ -226,7 +226,6 @@ module ActiveRecord
@association.build(attributes, &block)
end
- ##
# Returns a new object of the collection type that has been instantiated with
# attributes, linked to this object and that has already been saved (if it
# passes the validations).
@@ -257,7 +256,6 @@ module ActiveRecord
@association.create(attributes, &block)
end
- ##
# Like +create+, except that if the record is invalid, raises an exception.
#
# class Person
@@ -274,7 +272,6 @@ module ActiveRecord
@association.create!(attributes, &block)
end
- ##
# Add one or more records to the collection by setting their foreign keys
# to the association's primary key. Since << flattens its argument list and
# inserts each record, +push+ and +concat+ behave identically. Returns +self+
@@ -303,7 +300,6 @@ module ActiveRecord
@association.concat(*records)
end
- ##
# Replace this collection with +other_array+. This will perform a diff
# and delete/add only records that have changed.
#
@@ -330,7 +326,6 @@ module ActiveRecord
@association.replace(other_array)
end
- ##
# Deletes all the records from the collection. For +has_many+ associations,
# the deletion is done according to the strategy specified by the <tt>:dependent</tt>
# option. Returns an array with the deleted records.
@@ -423,7 +418,6 @@ module ActiveRecord
@association.delete_all
end
- ##
# Deletes the records of the collection directly from the database.
# This will _always_ remove the records ignoring the +:dependent+
# option.
@@ -450,7 +444,6 @@ module ActiveRecord
@association.destroy_all
end
- ##
# Deletes the +records+ supplied and removes them from the collection. For
# +has_many+ associations, the deletion is done according to the strategy
# specified by the <tt>:dependent</tt> option. Returns an array with the
@@ -514,7 +507,7 @@ module ActiveRecord
# Pet.find(1, 3)
# # => ActiveRecord::RecordNotFound: Couldn't find all Pets with IDs (1, 3)
#
- # If it is set to <tt>:delete_all</tt>, all the +records+ are deleted
+ # If it is set to <tt>:delete_all</tt>, all the +records+ are deleted
# *without* calling their +destroy+ method.
#
# class Person < ActiveRecord::Base
@@ -569,7 +562,6 @@ module ActiveRecord
@association.delete(*records)
end
- ##
# Destroys the +records+ supplied and removes them from the collection.
# This method will _always_ remove record from the database ignoring
# the +:dependent+ option. Returns an array with the removed records.
@@ -642,7 +634,6 @@ module ActiveRecord
@association.destroy(*records)
end
- ##
# Specifies whether the records should be unique or not.
#
# class Person < ActiveRecord::Base
@@ -661,7 +652,6 @@ module ActiveRecord
@association.uniq
end
- ##
# Count all records using SQL.
#
# class Person < ActiveRecord::Base
@@ -679,7 +669,6 @@ module ActiveRecord
@association.count(column_name, options)
end
- ##
# Returns the size of the collection. If the collection hasn't been loaded,
# it executes a <tt>SELECT COUNT(*)</tt> query.
#
@@ -704,7 +693,6 @@ module ActiveRecord
@association.size
end
- ##
# Returns the size of the collection calling +size+ on the target.
# If the collection has been already loaded, +length+ and +size+ are
# equivalent.
@@ -728,7 +716,6 @@ module ActiveRecord
@association.length
end
- ##
# Returns +true+ if the collection is empty.
#
# class Person < ActiveRecord::Base
@@ -746,7 +733,6 @@ module ActiveRecord
@association.empty?
end
- ##
# Returns +true+ if the collection is not empty.
#
# class Person < ActiveRecord::Base
@@ -780,7 +766,6 @@ module ActiveRecord
@association.any?(&block)
end
- ##
# Returns true if the collection has more than one record.
# Equivalent to <tt>collection.size > 1</tt>.
#
@@ -819,7 +804,6 @@ module ActiveRecord
@association.many?(&block)
end
- ##
# Returns +true+ if the given object is present in the collection.
#
# class Person < ActiveRecord::Base
@@ -889,7 +873,7 @@ module ActiveRecord
end
# Returns a new array of objects from the collection. If the collection
- # hasn't been loaded, it fetches the records from the database.
+ # hasn't been loaded, it fetches the records from the database.
#
# class Person < ActiveRecord::Base
# has_many :pets
diff --git a/activerecord/lib/active_record/attribute_methods/dirty.rb b/activerecord/lib/active_record/attribute_methods/dirty.rb
index 6204e4172d..7a5bb9e863 100644
--- a/activerecord/lib/active_record/attribute_methods/dirty.rb
+++ b/activerecord/lib/active_record/attribute_methods/dirty.rb
@@ -7,7 +7,7 @@ module ActiveRecord
end
module AttributeMethods
- module Dirty
+ module Dirty # :nodoc:
extend ActiveSupport::Concern
include ActiveModel::Dirty
@@ -21,7 +21,7 @@ module ActiveRecord
end
# Attempts to +save+ the record and clears changed attributes if successful.
- def save(*) #:nodoc:
+ def save(*)
if status = super
@previously_changed = changes
@changed_attributes.clear
@@ -30,7 +30,7 @@ module ActiveRecord
end
# Attempts to <tt>save!</tt> the record and clears changed attributes if successful.
- def save!(*) #:nodoc:
+ def save!(*)
super.tap do
@previously_changed = changes
@changed_attributes.clear
@@ -38,7 +38,7 @@ module ActiveRecord
end
# <tt>reload</tt> the record and clears changed attributes.
- def reload(*) #:nodoc:
+ def reload(*)
super.tap do
@previously_changed.clear
@changed_attributes.clear
diff --git a/activerecord/lib/active_record/attribute_methods/primary_key.rb b/activerecord/lib/active_record/attribute_methods/primary_key.rb
index aa6704d5c9..0857b02c8e 100644
--- a/activerecord/lib/active_record/attribute_methods/primary_key.rb
+++ b/activerecord/lib/active_record/attribute_methods/primary_key.rb
@@ -5,28 +5,29 @@ module ActiveRecord
module PrimaryKey
extend ActiveSupport::Concern
- # Returns this record's primary key value wrapped in an Array if one is available
+ # Returns this record's primary key value wrapped in an Array if one is
+ # available.
def to_key
key = self.id
[key] if key
end
- # Returns the primary key value
+ # Returns the primary key value.
def id
read_attribute(self.class.primary_key)
end
- # Sets the primary key value
+ # Sets the primary key value.
def id=(value)
write_attribute(self.class.primary_key, value) if self.class.primary_key
end
- # Queries the primary key value
+ # Queries the primary key value.
def id?
query_attribute(self.class.primary_key)
end
- # Returns the primary key value before type cast
+ # Returns the primary key value before type cast.
def id_before_type_cast
read_attribute_before_type_cast(self.class.primary_key)
end
@@ -52,14 +53,16 @@ module ActiveRecord
super && !ID_ATTRIBUTE_METHODS.include?(method_name)
end
- # Defines the primary key field -- can be overridden in subclasses. Overwriting will negate any effect of the
- # primary_key_prefix_type setting, though.
+ # Defines the primary key field -- can be overridden in subclasses.
+ # Overwriting will negate any effect of the +primary_key_prefix_type+
+ # setting, though.
def primary_key
@primary_key = reset_primary_key unless defined? @primary_key
@primary_key
end
- # Returns a quoted version of the primary key name, used to construct SQL statements.
+ # Returns a quoted version of the primary key name, used to construct
+ # SQL statements.
def quoted_primary_key
@quoted_primary_key ||= connection.quote_column_name(primary_key)
end
@@ -92,16 +95,17 @@ module ActiveRecord
# Sets the name of the primary key column.
#
# class Project < ActiveRecord::Base
- # self.primary_key = "sysid"
+ # self.primary_key = 'sysid'
# end
#
- # You can also define the primary_key method yourself:
+ # You can also define the +primary_key+ method yourself:
#
# class Project < ActiveRecord::Base
# def self.primary_key
- # "foo_" + super
+ # 'foo_' + super
# end
# end
+ #
# Project.primary_key # => "foo_id"
def primary_key=(value)
@primary_key = value && value.to_s
diff --git a/activerecord/lib/active_record/attribute_methods/read.rb b/activerecord/lib/active_record/attribute_methods/read.rb
index 1a4cb25dd7..6213b5dcd5 100644
--- a/activerecord/lib/active_record/attribute_methods/read.rb
+++ b/activerecord/lib/active_record/attribute_methods/read.rb
@@ -14,9 +14,10 @@ module ActiveRecord
end
module ClassMethods
- # +cache_attributes+ allows you to declare which converted attribute values should
- # be cached. Usually caching only pays off for attributes with expensive conversion
- # methods, like time related columns (e.g. +created_at+, +updated_at+).
+ # +cache_attributes+ allows you to declare which converted attribute
+ # values should be cached. Usually caching only pays off for attributes
+ # with expensive conversion methods, like time related columns (e.g.
+ # +created_at+, +updated_at+).
def cache_attributes(*attribute_names)
cached_attributes.merge attribute_names.map { |attr| attr.to_s }
end
@@ -65,8 +66,9 @@ module ActiveRecord
ActiveRecord::Model.attribute_types_cached_by_default = ATTRIBUTE_TYPES_CACHED_BY_DEFAULT
- # Returns the value of the attribute identified by <tt>attr_name</tt> after it has been typecast (for example,
- # "2004-12-12" in a data column is cast to a date object, like Date.new(2004, 12, 12)).
+ # Returns the value of the attribute identified by <tt>attr_name</tt> after
+ # it has been typecast (for example, "2004-12-12" in a data column is cast
+ # to a date object, like Date.new(2004, 12, 12)).
def read_attribute(attr_name)
return unless attr_name
name_sym = attr_name.to_sym
diff --git a/activerecord/lib/active_record/attribute_methods/serialization.rb b/activerecord/lib/active_record/attribute_methods/serialization.rb
index 6395f92b4b..9994a81ede 100644
--- a/activerecord/lib/active_record/attribute_methods/serialization.rb
+++ b/activerecord/lib/active_record/attribute_methods/serialization.rb
@@ -4,17 +4,19 @@ module ActiveRecord
extend ActiveSupport::Concern
included do
- # Returns a hash of all the attributes that have been specified for serialization as
- # keys and their class restriction as values.
+ # Returns a hash of all the attributes that have been specified for
+ # serialization as keys and their class restriction as values.
class_attribute :serialized_attributes, instance_accessor: false
self.serialized_attributes = {}
end
module ClassMethods
- # If you have an attribute that needs to be saved to the database as an object, and retrieved as the same object,
- # then specify the name of that attribute using this method and it will be handled automatically.
- # The serialization is done through YAML. If +class_name+ is specified, the serialized object must be of that
- # class on retrieval or SerializationTypeMismatch will be raised.
+ # If you have an attribute that needs to be saved to the database as an
+ # object, and retrieved as the same object, then specify the name of that
+ # attribute using this method and it will be handled automatically. The
+ # serialization is done through YAML. If +class_name+ is specified, the
+ # serialized object must be of that class on retrieval or
+ # <tt>SerializationTypeMismatch</tt> will be raised.
#
# ==== Parameters
#
@@ -22,7 +24,8 @@ module ActiveRecord
# * +class_name+ - Optional, class name that the object type should be equal to.
#
# ==== Example
- # # Serialize a preferences attribute
+ #
+ # # Serialize a preferences attribute.
# class User < ActiveRecord::Base
# serialize :preferences
# end
@@ -60,7 +63,7 @@ module ActiveRecord
end
end
- class Attribute < Struct.new(:coder, :value, :state)
+ class Attribute < Struct.new(:coder, :value, :state) # :nodoc:
def unserialized_value
state == :serialized ? unserialize : value
end
diff --git a/activerecord/lib/active_record/attribute_methods/write.rb b/activerecord/lib/active_record/attribute_methods/write.rb
index 5a39cb0125..6eb9e25fd9 100644
--- a/activerecord/lib/active_record/attribute_methods/write.rb
+++ b/activerecord/lib/active_record/attribute_methods/write.rb
@@ -20,8 +20,9 @@ module ActiveRecord
end
end
- # Updates the attribute identified by <tt>attr_name</tt> with the specified +value+. Empty strings
- # for fixnum and float columns are turned into +nil+.
+ # Updates the attribute identified by <tt>attr_name</tt> with the
+ # specified +value+. Empty strings for fixnum and float columns are
+ # turned into +nil+.
def write_attribute(attr_name, value)
attr_name = attr_name.to_s
attr_name = self.class.primary_key if attr_name == 'id' && self.class.primary_key
diff --git a/activerecord/lib/active_record/coders/yaml_column.rb b/activerecord/lib/active_record/coders/yaml_column.rb
index f17e7158de..f6cdc67b4d 100644
--- a/activerecord/lib/active_record/coders/yaml_column.rb
+++ b/activerecord/lib/active_record/coders/yaml_column.rb
@@ -1,9 +1,8 @@
require 'yaml'
module ActiveRecord
- # :stopdoc:
- module Coders
- class YAMLColumn
+ module Coders # :nodoc:
+ class YAMLColumn # :nodoc:
RESCUE_ERRORS = [ ArgumentError, Psych::SyntaxError ]
attr_accessor :object_class
@@ -41,5 +40,4 @@ module ActiveRecord
end
end
end
- # :startdoc
end
diff --git a/activerecord/lib/active_record/fixtures/file.rb b/activerecord/lib/active_record/fixtures/file.rb
index a9cabf5a7b..0f6ab3e396 100644
--- a/activerecord/lib/active_record/fixtures/file.rb
+++ b/activerecord/lib/active_record/fixtures/file.rb
@@ -3,7 +3,7 @@ require 'yaml'
module ActiveRecord
class Fixtures
- class File
+ class File # :nodoc:
include Enumerable
##
diff --git a/activerecord/lib/active_record/model.rb b/activerecord/lib/active_record/model.rb
index 16d9d404e3..f059840f4d 100644
--- a/activerecord/lib/active_record/model.rb
+++ b/activerecord/lib/active_record/model.rb
@@ -108,12 +108,9 @@ module ActiveRecord
# The default inheritance column name is +type+, which means it's a
# reserved word inside Active Record. To be able to use single-table
# inheritance with another column name, or to use the column +type+ in
- # your own model for something else, you can override this method to
- # return a different name:
+ # your own model for something else, you can set +inheritance_column+:
#
- # def self.inheritance_column
- # 'zoink'
- # end
+ # self.inheritance_column = 'zoink'
def inheritance_column
'type'
end
diff --git a/activerecord/lib/active_record/railtie.rb b/activerecord/lib/active_record/railtie.rb
index 41b3386c00..b11483de8c 100644
--- a/activerecord/lib/active_record/railtie.rb
+++ b/activerecord/lib/active_record/railtie.rb
@@ -10,7 +10,7 @@ require "action_controller/railtie"
module ActiveRecord
# = Active Record Railtie
- class Railtie < Rails::Railtie
+ class Railtie < Rails::Railtie # :nodoc:
config.active_record = ActiveSupport::OrderedOptions.new
config.app_generators.orm :active_record, :migration => true,
@@ -76,7 +76,7 @@ module ActiveRecord
config.after_initialize do |app|
ActiveSupport.on_load(:active_record) do
filename = File.join(app.config.paths["db"].first, "schema_cache.dump")
-
+
if File.file?(filename)
cache = Marshal.load File.binread filename
if cache.version == ActiveRecord::Migrator.current_version
diff --git a/activerecord/lib/active_record/railties/controller_runtime.rb b/activerecord/lib/active_record/railties/controller_runtime.rb
index c5db9b4625..7695eacbff 100644
--- a/activerecord/lib/active_record/railties/controller_runtime.rb
+++ b/activerecord/lib/active_record/railties/controller_runtime.rb
@@ -2,7 +2,7 @@ require 'active_support/core_ext/module/attr_internal'
require 'active_record/log_subscriber'
module ActiveRecord
- module Railties
+ module Railties # :nodoc:
module ControllerRuntime #:nodoc:
extend ActiveSupport::Concern
@@ -37,7 +37,7 @@ module ActiveRecord
end
end
- module ClassMethods
+ module ClassMethods # :nodoc:
def log_process_action(payload)
messages, db_runtime = super, payload[:db_runtime]
messages << ("ActiveRecord: %.1fms" % db_runtime.to_f) if db_runtime
diff --git a/activerecord/lib/active_record/scoping/default.rb b/activerecord/lib/active_record/scoping/default.rb
index a2a85d4b96..6835d0e01b 100644
--- a/activerecord/lib/active_record/scoping/default.rb
+++ b/activerecord/lib/active_record/scoping/default.rb
@@ -5,17 +5,17 @@ module ActiveRecord
extend ActiveSupport::Concern
included do
- # Stores the default scope for the class
+ # Stores the default scope for the class.
class_attribute :default_scopes, instance_writer: false
self.default_scopes = []
end
module ClassMethods
- # Returns a scope for the model without the default_scope.
+ # Returns a scope for the model without the +default_scope+.
#
# class Post < ActiveRecord::Base
# def self.default_scope
- # where :published => true
+ # where published: true
# end
# end
#
@@ -23,16 +23,16 @@ module ActiveRecord
# Post.unscoped.all # Fires "SELECT * FROM posts"
#
# This method also accepts a block. All queries inside the block will
- # not use the default_scope:
+ # not use the +default_scope+:
#
# Post.unscoped {
# Post.limit(10) # Fires "SELECT * FROM posts LIMIT 10"
# }
#
# It is recommended that you use the block form of unscoped because
- # chaining unscoped with <tt>scope</tt> does not work. Assuming that
- # <tt>published</tt> is a <tt>scope</tt>, the following two statements
- # are equal: the <tt>default_scope</tt> is applied on both.
+ # chaining unscoped with +scope+ does not work. Assuming that
+ # +published+ is a +scope+, the following two statements
+ # are equal: the +default_scope+ is applied on both.
#
# Post.unscoped.published
# Post.published
@@ -50,35 +50,37 @@ module ActiveRecord
# the model.
#
# class Article < ActiveRecord::Base
- # default_scope { where(:published => true) }
+ # default_scope { where(published: true) }
# end
#
# Article.all # => SELECT * FROM articles WHERE published = true
#
- # The <tt>default_scope</tt> is also applied while creating/building a record. It is not
- # applied while updating a record.
+ # The +default_scope+ is also applied while creating/building a record.
+ # It is not applied while updating a record.
#
# Article.new.published # => true
# Article.create.published # => true
#
- # (You can also pass any object which responds to <tt>call</tt> to the <tt>default_scope</tt>
- # macro, and it will be called when building the default scope.)
+ # (You can also pass any object which responds to +call+ to the
+ # +default_scope+ macro, and it will be called when building the
+ # default scope.)
#
- # If you use multiple <tt>default_scope</tt> declarations in your model then they will
- # be merged together:
+ # If you use multiple +default_scope+ declarations in your model then
+ # they will be merged together:
#
# class Article < ActiveRecord::Base
- # default_scope { where(:published => true) }
- # default_scope { where(:rating => 'G') }
+ # default_scope { where(published: true) }
+ # default_scope { where(rating: 'G') }
# end
#
# Article.all # => SELECT * FROM articles WHERE published = true AND rating = 'G'
#
- # This is also the case with inheritance and module includes where the parent or module
- # defines a <tt>default_scope</tt> and the child or including class defines a second one.
+ # This is also the case with inheritance and module includes where the
+ # parent or module defines a +default_scope+ and the child or including
+ # class defines a second one.
#
- # If you need to do more complex things with a default scope, you can alternatively
- # define it as a class method:
+ # If you need to do more complex things with a default scope, you can
+ # alternatively define it as a class method:
#
# class Article < ActiveRecord::Base
# def self.default_scope
@@ -100,7 +102,7 @@ module ActiveRecord
self.default_scopes = default_scopes + [scope]
end
- def build_default_scope #:nodoc:
+ def build_default_scope # :nodoc:
if !Base.is_a?(method(:default_scope).owner)
# The user has defined their own default scope method, so call that
evaluate_default_scope { default_scope }
@@ -117,17 +119,18 @@ module ActiveRecord
end
end
- def ignore_default_scope? #:nodoc:
+ def ignore_default_scope? # :nodoc:
Thread.current["#{self}_ignore_default_scope"]
end
- def ignore_default_scope=(ignore) #:nodoc:
+ def ignore_default_scope=(ignore) # :nodoc:
Thread.current["#{self}_ignore_default_scope"] = ignore
end
- # The ignore_default_scope flag is used to prevent an infinite recursion situation where
- # a default scope references a scope which has a default scope which references a scope...
- def evaluate_default_scope
+ # The ignore_default_scope flag is used to prevent an infinite recursion
+ # situation where a default scope references a scope which has a default
+ # scope which references a scope...
+ def evaluate_default_scope # :nodoc:
return if ignore_default_scope?
begin
diff --git a/activerecord/lib/active_record/scoping/named.rb b/activerecord/lib/active_record/scoping/named.rb
index 75f31229b5..fb5f5b5be0 100644
--- a/activerecord/lib/active_record/scoping/named.rb
+++ b/activerecord/lib/active_record/scoping/named.rb
@@ -3,7 +3,7 @@ require 'active_support/core_ext/hash/except'
require 'active_support/core_ext/kernel/singleton_class'
module ActiveRecord
- # = Active Record Named \Scopes
+ # = Active Record \Named \Scopes
module Scoping
module Named
extend ActiveSupport::Concern
@@ -16,11 +16,11 @@ module ActiveRecord
# posts.each {|p| puts p.name } # Fires "select * from posts" and loads post objects
#
# fruits = Fruit.all
- # fruits = fruits.where(:color => 'red') if options[:red_only]
+ # fruits = fruits.where(color: 'red') if options[:red_only]
# fruits = fruits.limit(10) if limited?
#
- # You can define a \scope that applies to all finders using
- # ActiveRecord::Base.default_scope.
+ # You can define a scope that applies to all finders using
+ # <tt>ActiveRecord::Base.default_scope</tt>.
def all
if current_scope
current_scope.clone
@@ -31,7 +31,6 @@ module ActiveRecord
end
end
- ##
# Collects attributes from scopes that should be applied when creating
# an AR instance for the particular class this is called on.
def scope_attributes # :nodoc:
@@ -44,86 +43,70 @@ module ActiveRecord
end
end
- ##
# Are there default attributes associated with this scope?
def scope_attributes? # :nodoc:
current_scope || default_scopes.any?
end
- # Adds a class method for retrieving and querying objects. A \scope represents a narrowing of a database query,
- # such as <tt>where(:color => :red).select('shirts.*').includes(:washing_instructions)</tt>.
+ # Adds a class method for retrieving and querying objects. A \scope
+ # represents a narrowing of a database query, such as
+ # <tt>where(color: :red).select('shirts.*').includes(:washing_instructions)</tt>.
#
# class Shirt < ActiveRecord::Base
- # scope :red, where(:color => 'red')
- # scope :dry_clean_only, joins(:washing_instructions).where('washing_instructions.dry_clean_only = ?', true)
+ # scope :red, -> { where(color: 'red') }
+ # scope :dry_clean_only, -> { joins(:washing_instructions).where('washing_instructions.dry_clean_only = ?', true) }
# end
#
- # The above calls to <tt>scope</tt> define class methods Shirt.red and Shirt.dry_clean_only. Shirt.red,
- # in effect, represents the query <tt>Shirt.where(:color => 'red')</tt>.
+ # The above calls to +scope+ define class methods <tt>Shirt.red</tt> and
+ # <tt>Shirt.dry_clean_only</tt>. <tt>Shirt.red</tt>, in effect,
+ # represents the query <tt>Shirt.where(color: 'red')</tt>.
#
- # Note that this is simply 'syntactic sugar' for defining an actual class method:
+ # You should always pass a callable object to the scopes defined
+ # with +scope+. This ensures that the scope is re-evaluated each
+ # time it is called.
+ #
+ # Note that this is simply 'syntactic sugar' for defining an actual
+ # class method:
#
# class Shirt < ActiveRecord::Base
# def self.red
- # where(:color => 'red')
+ # where(color: 'red')
# end
# end
#
- # Unlike <tt>Shirt.find(...)</tt>, however, the object returned by Shirt.red is not an Array; it
- # resembles the association object constructed by a <tt>has_many</tt> declaration. For instance,
- # you can invoke <tt>Shirt.red.first</tt>, <tt>Shirt.red.count</tt>, <tt>Shirt.red.where(:size => 'small')</tt>.
- # Also, just as with the association objects, named \scopes act like an Array, implementing Enumerable;
- # <tt>Shirt.red.each(&block)</tt>, <tt>Shirt.red.first</tt>, and <tt>Shirt.red.inject(memo, &block)</tt>
- # all behave as if Shirt.red really was an Array.
- #
- # These named \scopes are composable. For instance, <tt>Shirt.red.dry_clean_only</tt> will produce
- # all shirts that are both red and dry clean only.
- # Nested finds and calculations also work with these compositions: <tt>Shirt.red.dry_clean_only.count</tt>
- # returns the number of garments for which these criteria obtain. Similarly with
- # <tt>Shirt.red.dry_clean_only.average(:thread_count)</tt>.
- #
- # All \scopes are available as class methods on the ActiveRecord::Base descendant upon which
- # the \scopes were defined. But they are also available to <tt>has_many</tt> associations. If,
+ # Unlike <tt>Shirt.find(...)</tt>, however, the object returned by
+ # <tt>Shirt.red</tt> is not an Array; it resembles the association object
+ # constructed by a +has_many+ declaration. For instance, you can invoke
+ # <tt>Shirt.red.first</tt>, <tt>Shirt.red.count</tt>,
+ # <tt>Shirt.red.where(size: 'small')</tt>. Also, just as with the
+ # association objects, named \scopes act like an Array, implementing
+ # Enumerable; <tt>Shirt.red.each(&block)</tt>, <tt>Shirt.red.first</tt>,
+ # and <tt>Shirt.red.inject(memo, &block)</tt> all behave as if
+ # <tt>Shirt.red</tt> really was an Array.
+ #
+ # These named \scopes are composable. For instance,
+ # <tt>Shirt.red.dry_clean_only</tt> will produce all shirts that are
+ # both red and dry clean only. Nested finds and calculations also work
+ # with these compositions: <tt>Shirt.red.dry_clean_only.count</tt>
+ # returns the number of garments for which these criteria obtain.
+ # Similarly with <tt>Shirt.red.dry_clean_only.average(:thread_count)</tt>.
+ #
+ # All scopes are available as class methods on the ActiveRecord::Base
+ # descendant upon which the \scopes were defined. But they are also
+ # available to +has_many+ associations. If,
#
# class Person < ActiveRecord::Base
# has_many :shirts
# end
#
- # then <tt>elton.shirts.red.dry_clean_only</tt> will return all of Elton's red, dry clean
- # only shirts.
- #
- # Named \scopes can also be procedural:
- #
- # class Shirt < ActiveRecord::Base
- # scope :colored, lambda { |color| where(:color => color) }
- # end
- #
- # In this example, <tt>Shirt.colored('puce')</tt> finds all puce shirts.
- #
- # On Ruby 1.9 you can use the 'stabby lambda' syntax:
- #
- # scope :colored, ->(color) { where(:color => color) }
- #
- # Note that scopes defined with \scope will be evaluated when they are defined, rather than
- # when they are used. For example, the following would be incorrect:
- #
- # class Post < ActiveRecord::Base
- # scope :recent, where('published_at >= ?', Time.current - 1.week)
- # end
- #
- # The example above would be 'frozen' to the <tt>Time.current</tt> value when the <tt>Post</tt>
- # class was defined, and so the resultant SQL query would always be the same. The correct
- # way to do this would be via a lambda, which will re-evaluate the scope each time
- # it is called:
- #
- # class Post < ActiveRecord::Base
- # scope :recent, lambda { where('published_at >= ?', Time.current - 1.week) }
- # end
+ # then <tt>elton.shirts.red.dry_clean_only</tt> will return all of
+ # Elton's red, dry clean only shirts.
#
- # Named \scopes can also have extensions, just as with <tt>has_many</tt> declarations:
+ # \Named scopes can also have extensions, just as with +has_many+
+ # declarations:
#
# class Shirt < ActiveRecord::Base
- # scope :red, where(:color => 'red') do
+ # scope :red, -> { where(color: 'red') } do
# def dom_id
# 'red_shirts'
# end
@@ -133,18 +116,18 @@ module ActiveRecord
# Scopes can also be used while creating/building a record.
#
# class Article < ActiveRecord::Base
- # scope :published, where(:published => true)
+ # scope :published, -> { where(published: true) }
# end
#
# Article.published.new.published # => true
# Article.published.create.published # => true
#
- # Class methods on your model are automatically available
+ # \Class methods on your model are automatically available
# on scopes. Assuming the following setup:
#
# class Article < ActiveRecord::Base
- # scope :published, where(:published => true)
- # scope :featured, where(:featured => true)
+ # scope :published, -> { where(published: true) }
+ # scope :featured, -> { where(featured: true) }
#
# def self.latest_article
# order('published_at desc').first
diff --git a/activerecord/lib/active_record/validations.rb b/activerecord/lib/active_record/validations.rb
index ed561bfb3c..019290725d 100644
--- a/activerecord/lib/active_record/validations.rb
+++ b/activerecord/lib/active_record/validations.rb
@@ -10,8 +10,8 @@ module ActiveRecord
# puts invalid.record.errors
# end
class RecordInvalid < ActiveRecordError
- attr_reader :record
- def initialize(record)
+ attr_reader :record # :nodoc:
+ def initialize(record) # :nodoc:
@record = record
errors = @record.errors.full_messages.join(", ")
super(I18n.t(:"#{@record.class.i18n_scope}.errors.messages.record_invalid", :errors => errors, :default => :"errors.messages.record_invalid"))
@@ -44,23 +44,24 @@ module ActiveRecord
end
end
- # The validation process on save can be skipped by passing <tt>:validate => false</tt>. The regular Base#save method is
- # replaced with this when the validations module is mixed in, which it is by default.
+ # The validation process on save can be skipped by passing <tt>validate: false</tt>.
+ # The regular Base#save method is replaced with this when the validations
+ # module is mixed in, which it is by default.
def save(options={})
perform_validations(options) ? super : false
end
- # Attempts to save the record just like Base#save but will raise a +RecordInvalid+ exception instead of returning false
- # if the record is not valid.
+ # Attempts to save the record just like Base#save but will raise a +RecordInvalid+
+ # exception instead of returning +false+ if the record is not valid.
def save!(options={})
perform_validations(options) ? super : raise(RecordInvalid.new(self))
end
- # Runs all the validations within the specified context. Returns true if no errors are found,
- # false otherwise.
+ # Runs all the validations within the specified context. Returns +true+ if
+ # no errors are found, +false+ otherwise.
#
- # If the argument is false (default is +nil+), the context is set to <tt>:create</tt> if
- # <tt>new_record?</tt> is true, and to <tt>:update</tt> if it is not.
+ # If the argument is +false+ (default is +nil+), the context is set to <tt>:create</tt> if
+ # <tt>new_record?</tt> is +true+, and to <tt>:update</tt> if it is not.
#
# Validations with no <tt>:on</tt> option will run no matter the context. Validations with
# some <tt>:on</tt> option will only run in the specified context.
@@ -72,7 +73,7 @@ module ActiveRecord
protected
- def perform_validations(options={})
+ def perform_validations(options={}) # :nodoc:
perform_validation = options[:validate] != false
perform_validation ? valid?(options[:context]) : true
end
diff --git a/activerecord/lib/active_record/validations/associated.rb b/activerecord/lib/active_record/validations/associated.rb
index 1fa6629980..7f1972ccf9 100644
--- a/activerecord/lib/active_record/validations/associated.rb
+++ b/activerecord/lib/active_record/validations/associated.rb
@@ -38,7 +38,7 @@ module ActiveRecord
# proc or string should return or evaluate to a +true+ or +false+ value.
# * <tt>:unless</tt> - Specifies a method, proc or string to call to
# determine if the validation should not occur (e.g. <tt>unless: :skip_validation</tt>,
- # or <tt>unless: => Proc.new { |user| user.signup_step <= 2 }</tt>). The
+ # or <tt>unless: Proc.new { |user| user.signup_step <= 2 }</tt>). The
# method, proc or string should return or evaluate to a +true+ or +false+
# value.
def validates_associated(*attr_names)
diff --git a/activerecord/lib/active_record/validations/presence.rb b/activerecord/lib/active_record/validations/presence.rb
index 056527b512..81a3521d24 100644
--- a/activerecord/lib/active_record/validations/presence.rb
+++ b/activerecord/lib/active_record/validations/presence.rb
@@ -1,6 +1,6 @@
module ActiveRecord
module Validations
- class PresenceValidator < ActiveModel::Validations::PresenceValidator
+ class PresenceValidator < ActiveModel::Validations::PresenceValidator # :nodoc:
def validate(record)
super
attributes.each do |attribute|
@@ -29,7 +29,7 @@ module ActiveRecord
#
# If you want to validate the presence of a boolean field (where the real values
# are true and false), you will want to use
- # <tt>validates_inclusion_of :field_name, :in => [true, false]</tt>.
+ # <tt>validates_inclusion_of :field_name, in: [true, false]</tt>.
#
# This is due to the way Object#blank? handles boolean values:
# <tt>false.blank? # => true</tt>.
@@ -46,16 +46,15 @@ module ActiveRecord
# validation contexts by default (+nil+), other options are <tt>:create</tt>
# and <tt>:update</tt>.
# * <tt>:if</tt> - Specifies a method, proc or string to call to determine if
- # the validation should occur (e.g. <tt>:if => :allow_validation</tt>, or
- # <tt>:if => Proc.new { |user| user.signup_step > 2 }</tt>). The method, proc
- # or string should return or evaluate to a true or false value.
+ # the validation should occur (e.g. <tt>if: :allow_validation</tt>, or
+ # <tt>if: Proc.new { |user| user.signup_step > 2 }</tt>). The method, proc
+ # or string should return or evaluate to a +true+ or +false+ value.
# * <tt>:unless</tt> - Specifies a method, proc or string to call to determine
- # if the validation should not occur (e.g. <tt>:unless => :skip_validation</tt>,
- # or <tt>:unless => Proc.new { |user| user.signup_step <= 2 }</tt>). The method,
- # proc or string should return or evaluate to a true or false value.
+ # if the validation should not occur (e.g. <tt>unless: :skip_validation</tt>,
+ # or <tt>unless: Proc.new { |user| user.signup_step <= 2 }</tt>). The method,
+ # proc or string should return or evaluate to a +true+ or +false+ value.
# * <tt>:strict</tt> - Specifies whether validation should be strict.
# See <tt>ActiveModel::Validation#validates!</tt> for more information.
- #
def validates_presence_of(*attr_names)
validates_with PresenceValidator, _merge_attributes(attr_names)
end
diff --git a/activerecord/lib/active_record/validations/uniqueness.rb b/activerecord/lib/active_record/validations/uniqueness.rb
index c117872ac8..f3620c1324 100644
--- a/activerecord/lib/active_record/validations/uniqueness.rb
+++ b/activerecord/lib/active_record/validations/uniqueness.rb
@@ -2,7 +2,7 @@ require 'active_support/core_ext/array/prepend_and_append'
module ActiveRecord
module Validations
- class UniquenessValidator < ActiveModel::EachValidator #:nodoc:
+ class UniquenessValidator < ActiveModel::EachValidator # :nodoc:
def initialize(options)
super(options.reverse_merge(:case_sensitive => true))
end
@@ -199,7 +199,7 @@ module ActiveRecord
# can catch it and restart the transaction (e.g. by telling the user
# that the title already exists, and asking him to re-enter the title).
# This technique is also known as optimistic concurrency control:
- # http://en.wikipedia.org/wiki/Optimistic_concurrency_control
+ # http://en.wikipedia.org/wiki/Optimistic_concurrency_control.
#
# The bundled ActiveRecord::ConnectionAdapters distinguish unique index
# constraint errors from other types of database errors by throwing an
@@ -209,10 +209,10 @@ module ActiveRecord
#
# The following bundled adapters throw the ActiveRecord::RecordNotUnique exception:
#
- # * ActiveRecord::ConnectionAdapters::MysqlAdapter
- # * ActiveRecord::ConnectionAdapters::Mysql2Adapter
- # * ActiveRecord::ConnectionAdapters::SQLite3Adapter
- # * ActiveRecord::ConnectionAdapters::PostgreSQLAdapter
+ # * ActiveRecord::ConnectionAdapters::MysqlAdapter.
+ # * ActiveRecord::ConnectionAdapters::Mysql2Adapter.
+ # * ActiveRecord::ConnectionAdapters::SQLite3Adapter.
+ # * ActiveRecord::ConnectionAdapters::PostgreSQLAdapter.
def validates_uniqueness_of(*attr_names)
validates_with UniquenessValidator, _merge_attributes(attr_names)
end