diff options
author | Juanjo Bazán <jjbazan@gmail.com> | 2012-01-30 21:36:47 +0100 |
---|---|---|
committer | Juanjo Bazán <jjbazan@gmail.com> | 2012-01-31 19:50:09 +0100 |
commit | 8270e4a8ce8337fca98030953922e5992b06a3dd (patch) | |
tree | b7a1c68c6fe36a18c88e92363f648b609091ee5f /activerecord/lib/active_record/relation/query_methods.rb | |
parent | bb842e8d2111e50b21a14b8bd6d89371a4b9cd68 (diff) | |
download | rails-8270e4a8ce8337fca98030953922e5992b06a3dd.tar.gz rails-8270e4a8ce8337fca98030953922e5992b06a3dd.tar.bz2 rails-8270e4a8ce8337fca98030953922e5992b06a3dd.zip |
Added `none` query method to return zero records.
And added NullRelation class implementing the null object pattern for the `Relation` class.
Diffstat (limited to 'activerecord/lib/active_record/relation/query_methods.rb')
-rw-r--r-- | activerecord/lib/active_record/relation/query_methods.rb | 33 |
1 files changed, 33 insertions, 0 deletions
diff --git a/activerecord/lib/active_record/relation/query_methods.rb b/activerecord/lib/active_record/relation/query_methods.rb index a8ae7208fc..6a28d7b155 100644 --- a/activerecord/lib/active_record/relation/query_methods.rb +++ b/activerecord/lib/active_record/relation/query_methods.rb @@ -196,6 +196,39 @@ module ActiveRecord relation end + # Returns a chainable relation with zero records, specifically an + # instance of the NullRelation class. + # + # The returned NullRelation inherits from Relation and implements the + # Null Object pattern so it is an object with defined null behavior: + # it always returns an empty array of records and avoids any database query. + # + # Any subsequent condition chained to the returned relation will continue + # generating an empty relation and will not fire any query to the database. + # + # Used in cases where is needed a method or a scope that could return zero + # results but the response has to be chainable. + # + # For example: + # + # @posts = current_user.visible_posts.where(:name => params[:name]) + # # => the visible_post method response has to be a chainable Relation + # + # def visible_posts + # case role + # if 'Country Manager' + # Post.where(:country => country) + # if 'Reviewer' + # Post.published + # if 'Bad User' + # Post.none # => returning [] instead breaks the previous code + # end + # end + # + def none + NullRelation.new(@klass, @table) + end + def readonly(value = true) relation = clone relation.readonly_value = value |