query_methods_extend 0.0.2 → 0.0.3

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.
checksums.yaml CHANGED
@@ -1,7 +1,7 @@
1
1
  ---
2
2
  SHA1:
3
- metadata.gz: 92bc332107fea0d943bd445ed9f3449f89852608
4
- data.tar.gz: e9c696a7b9f18bf19d010aaa4154f8374651f3b4
3
+ metadata.gz: 5537e9ae6543ee2f654652c6f1cb653980a93457
4
+ data.tar.gz: 5a93706ff44adffed4fcd8faa2520bc7bd751b2f
5
5
  SHA512:
6
- metadata.gz: c4e4210ab6236a76cb7735f28d8d36f80084a76c9d2be604010dd362c09f695373965bf2f4f21f06f3ec31a19de95a48adb6a23edac4ad61a8a7e5770d68fce8
7
- data.tar.gz: fe68bbc1c89c29289082e48dd41706340d24a3c37128f6d5bf4f2937f78b4b1e23041a4b1c259382e9570a9e05681329e17174ea6ced6a2c54106139e12dfc09
6
+ metadata.gz: 01356c41c4b19c33bba359a8f146f1fce1d96f01ed8965e272ba80add857dcde335c3245a7be9afa4e42cbd191cd15ee09dbde9b54fd9f37df870f98107c91c7
7
+ data.tar.gz: 9a8a773fcd5e2340303745fa97d46d858ef3d98da07a4d760edd98a8f5d5641daa991bbf71a39184f3c8044238434c0d99e988a5dbd367632f13820a6ac50c0c
data/README.md CHANGED
@@ -18,14 +18,58 @@ include QueryMethodsExtend
18
18
 
19
19
  ## Usage
20
20
 
21
- The structure book model:
21
+ The structure book models:
22
22
  ```ruby
23
- Book(
24
- id: integer,
25
- name: string,
26
- price: decimal,
27
- created_at: datetime,
28
- updated_at: datetime
23
+ class Store < ActiveRecord::Base
24
+ include QueryMethodsExtend
25
+ has_many :categories
26
+ end
27
+ // Store(id: integer, address: string)
28
+
29
+ class Category < ActiveRecord::Base
30
+ include QueryMethodsExtend
31
+ belongs_to :store
32
+ has_many :books
33
+ end
34
+ // Category(id: integer, name: string, store_id: integer)
35
+
36
+ class Book < ActiveRecord::Base
37
+ include QueryMethodsExtend
38
+ belongs_to :category
39
+ end
40
+ // Book(id: integer, name: string, price: integer, category_id: integer)
41
+ ```
42
+
43
+ ## Has_many with collection
44
+ Before with asscociation **:has_many**, take **all categories in the stores** in Vietnam, we can write:
45
+ ```ruby
46
+ Category.where(store_id: Store.where(address: 'Vietnam'))
47
+ ```
48
+ And now we can write in collection:
49
+ ```ruby
50
+ Store.where(address: 'Vietnam').categories
51
+
52
+ ***
53
+ SELECT "categories".* FROM "categories"
54
+ WHERE (categories.store_id IN (
55
+ SELECT "stores"."id" FROM "stores" WHERE "stores"."address" = 'Vietnam'
56
+ )
57
+ )
58
+ ```
59
+
60
+ And take **all books in the stores** in Vietnam (without use **:through**):
61
+ ```ruby
62
+ Store.where(address: 'Vietnam').categories.books
63
+
64
+ ***
65
+ SELECT "books".* FROM "books"
66
+ WHERE (books.category_id IN (
67
+ SELECT "categories"."id" FROM "categories"
68
+ WHERE (categories.store_id IN (
69
+ SELECT "stores"."id" FROM "stores" WHERE "stores"."address" = 'Vietnam'
70
+ )
71
+ )
72
+ )
29
73
  )
30
74
  ```
31
75
 
@@ -108,9 +152,9 @@ SELECT "books".* FROM "books"
108
152
 
109
153
  ## Like query
110
154
  ```ruby
111
- Book.like(name: 'ruby')
155
+ Book.like(name: 'ruby', price: '$')
112
156
  ***
113
- SELECT "books".* FROM "books" WHERE (books.name LIKE '%ruby%')
157
+ SELECT "books".* FROM "books" WHERE (books.name LIKE '%ruby%' AND books.price LIKE '%$%')
114
158
 
115
159
  Book.l_like(name: 'ruby')
116
160
  ***
@@ -127,9 +171,9 @@ SELECT "books".* FROM "books" WHERE (books.name LIKE '%ruby%')
127
171
 
128
172
  ## Operators query
129
173
  ```ruby
130
- Book.lt(price: 5)
174
+ Book.lt(price: 5, id: 10)
131
175
  ***
132
- SELECT "books".* FROM "books" WHERE (books.price < 5)
176
+ SELECT "books".* FROM "books" WHERE (books.price < 5 AND books.id < 10)
133
177
 
134
178
  Book.lteq(price: 5)
135
179
  ***
@@ -1,4 +1,6 @@
1
1
  require "query_methods_extend/version"
2
+ require "query_methods_extend/basic"
3
+ require "query_methods_extend/association"
2
4
  require "query_methods_extend/or"
3
5
  require "query_methods_extend/like"
4
6
  require "query_methods_extend/operators"
@@ -6,6 +8,8 @@ require "query_methods_extend/union"
6
8
 
7
9
  module QueryMethodsExtend extend ActiveSupport::Concern
8
10
  included do
11
+ include Basic
12
+ include Association
9
13
  include OrQuery
10
14
  include Like
11
15
  include Operators
@@ -0,0 +1,33 @@
1
+ module QueryMethodsExtend
2
+ module Association
3
+ @check_association_exist_flag = false
4
+
5
+ def method_missing(method_name, *args, &block)
6
+ if respond_to? method_name
7
+ super
8
+ else
9
+ check_association_exist(method_name) || super
10
+ end
11
+ end
12
+
13
+ def check_association_exist method_name
14
+ if @check_association_exist_flag
15
+ return false
16
+ end
17
+
18
+ @check_association_exist_flag = true
19
+
20
+ association = self.try(:reflect_on_association, method_name)
21
+ result = false
22
+ if association && association.macro == :has_many
23
+ model_reflect = association.inverse_of
24
+ model = model_reflect.active_record
25
+ query = self.select(association.primary_key_column.name)
26
+ result = model.where("#{model.table_name}.#{model_reflect.foreign_key.to_sym} IN (#{query.to_sql})")
27
+ end
28
+
29
+ @check_association_exist_flag = false
30
+ return result
31
+ end
32
+ end
33
+ end
@@ -0,0 +1,9 @@
1
+ module QueryMethodsExtend
2
+ module Basic extend ActiveSupport::Concern
3
+ included do
4
+ def self.where(opts, *rest)
5
+ super(opts, *rest).all.extending(Association, OrExtend)
6
+ end
7
+ end
8
+ end
9
+ end
@@ -1,5 +1,5 @@
1
1
  module QueryMethodsExtend
2
- module ExtendMethods
2
+ module OrExtend
3
3
  @is_query_or = false
4
4
 
5
5
  def set_is_query_or value
@@ -39,7 +39,7 @@ module QueryMethodsExtend
39
39
  raise 'Agruments should be a HASH'
40
40
  end
41
41
  else
42
- all.extending(ExtendMethods).set_is_query_or(true)
42
+ all.set_is_query_or(true)
43
43
  end
44
44
  }
45
45
  end
@@ -1,3 +1,3 @@
1
1
  module QueryMethodsExtend
2
- VERSION = "0.0.2"
2
+ VERSION = "0.0.3"
3
3
  end
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: query_methods_extend
3
3
  version: !ruby/object:Gem::Version
4
- version: 0.0.2
4
+ version: 0.0.3
5
5
  platform: ruby
6
6
  authors:
7
7
  - Alicuche
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2015-01-22 00:00:00.000000000 Z
11
+ date: 2015-01-25 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: bundler
@@ -51,6 +51,8 @@ files:
51
51
  - README.md
52
52
  - Rakefile
53
53
  - lib/query_methods_extend.rb
54
+ - lib/query_methods_extend/association.rb
55
+ - lib/query_methods_extend/basic.rb
54
56
  - lib/query_methods_extend/like.rb
55
57
  - lib/query_methods_extend/operators.rb
56
58
  - lib/query_methods_extend/or.rb