active_record_not 1.0.0 → 1.0.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
data/README.md ADDED
@@ -0,0 +1,45 @@
1
+ # active_record_not
2
+
3
+ Adds #not to your ActiveRecord querying. This works similarly to #where, but inversed!
4
+
5
+ ## Installation
6
+
7
+ `gem install active_record_not`, or add active_record_not to your Gemfile and `bundle install`.
8
+
9
+ https://rubygems.org/gems/active_record_not
10
+
11
+ ## Usage
12
+
13
+ Given a model...
14
+
15
+ class User < ActiveRecord::Base
16
+ attr_accessible :name, :email, :phone, :employee_number, :sysadmin
17
+ ...
18
+ scope :contactable, where("email is not null OR phone is not null")
19
+ scope :employee, where("employee_number > 0")
20
+ ...
21
+ end
22
+
23
+ You could write...
24
+
25
+ # Provide a symbol, which corresponds to a scope, to negate that scope.
26
+ User.not(:contactable) # users that aren't contactable
27
+
28
+ # Provide a scope explicitly, to negate it
29
+ User.not(User.employee) # users that aren't employees
30
+
31
+ # Provide a hash or string to negate it
32
+ User.not(sysadmin: true) # users that aren't sysadmins
33
+ User.not("employee_number like '1'") # users where the employee number doesn't contain a 1
34
+
35
+ You can also use `#not` within a chain of queries...
36
+
37
+ User.where(sysadmin: true).not("name like 'Alex'")
38
+
39
+ ## Credits
40
+
41
+ Inspired by [active_record_or](https://github.com/woahdae/active_record_or).
42
+
43
+ ## Copyright
44
+
45
+ Copyright (c) 2013 Alex Ghiculescu. See LICENSE.txt for further details.
@@ -1,5 +1,5 @@
1
1
  # -*- encoding : utf-8 -*-
2
2
 
3
3
  module ActiveRecordNot
4
- VERSION = "1.0.0"
4
+ VERSION = "1.0.1"
5
5
  end
@@ -7,16 +7,18 @@ module ActiveRecordNot
7
7
 
8
8
  case args
9
9
  when Symbol
10
- constrainted_not = left.unscoped.send(args) # eg. User.not(:active), where User#active is a scope
10
+ constrainted_not = left.unscoped.send(args).constraints.last.not # eg. User.not(:active), where User#active is a scope
11
11
  when Hash
12
12
  constrainted_not = left.unscoped.where(args).constraints.last.not # eg. User.not(active: true), so syntax like #where
13
+ when String
14
+ constrainted_not = left.unscoped.where(args).constraints.last.not # eg. User.not("is_active = 't'h;"), so syntax like #where
13
15
  when ActiveRecord::Relation
14
16
  constrainted_not = args.constraints.last.not # eg. User.not(User.active), where User#active is a scope
15
17
  end
16
-
18
+
17
19
  merged_not = last_left_constraint.nil? ? constrainted_not : last_left_constraint.and(constrainted_not)
18
20
 
19
- right = left.where(args)
21
+ right = left.dup
20
22
  right.where_values = [merged_not]
21
23
  right
22
24
  end
metadata CHANGED
@@ -1,7 +1,7 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_not
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.1
5
5
  prerelease:
6
6
  platform: ruby
7
7
  authors:
@@ -9,7 +9,7 @@ authors:
9
9
  autorequire:
10
10
  bindir: bin
11
11
  cert_chain: []
12
- date: 2013-01-22 00:00:00.000000000 Z
12
+ date: 2013-01-23 00:00:00.000000000 Z
13
13
  dependencies:
14
14
  - !ruby/object:Gem::Dependency
15
15
  name: activerecord
@@ -36,6 +36,7 @@ extra_rdoc_files: []
36
36
  files:
37
37
  - lib/active_record_not/version.rb
38
38
  - lib/active_record_not.rb
39
+ - README.md
39
40
  homepage: http://rubygems.org/gems/active_record_not
40
41
  licenses: []
41
42
  post_install_message: