active_record_simple_execute 1.0.0 → 1.1.0

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
  SHA256:
3
- metadata.gz: a104f89547cb18fd208b3cd22043bfd185cb81109522fc90f9176ff92d341858
4
- data.tar.gz: 6aa1b61f1acbabcbebc3deb7190b4fd24a1755774a9c005cc84645511b069e9e
3
+ metadata.gz: a2bdba6b0063a89fdb67b412435ac5f1216e9d91bae6409dbc6508e4800fc1a4
4
+ data.tar.gz: bc6be6a5ce0e62d0f16f3e02f8367de49729c79e9c68e7408ea2e384861bfeca
5
5
  SHA512:
6
- metadata.gz: da04345171c9cd13bee15de0f766ce34ffc8c8e356949a7bd8ae35a027feae5019c09b857ea441cc8a88fff1a66fe92b4c779b4c7a8a922316eea385afda2e69
7
- data.tar.gz: 5f5e6f73d5e51b377e04e5a62bb06173004f33d1a4c3fac0c88f0296b0bb25ed8a23f2b5ecaa1b05df4589b86ce9562911e6935c66fe8b9d15fb21d55d5ee4a5
6
+ metadata.gz: 385b6d4fbe5a37e64d6f701aa91020f94a283e8445dd40726ac9974d7089705e5f1d56ad7c87b871ab6d46ad5d3ea41815e8854223d90d2228ab0033fb96e049
7
+ data.tar.gz: 8a9967b9f13f356f529a8dd479abe16d06afc02d66c04ae7fec694ed93518fe1e58789504e5acf9685201742a3138cd7cdfeba34ffb21fadf5b53b81f3199e1c
data/CHANGELOG.md CHANGED
@@ -1,9 +1,12 @@
1
1
  CHANGELOG
2
2
  ---------
3
3
 
4
- - Unreleased - [View Diff](https://github.com/westonganger/active_record_simple_execute/compare/v1.0.0...master)
4
+ - Unreleased - [View Diff](https://github.com/westonganger/active_record_simple_execute/compare/v1.1.0...master)
5
5
  * Nothing yet
6
6
 
7
+ - v1.1.0 - Nov 27, 2024 - [View Diff](https://github.com/westonganger/active_record_simple_execute/compare/v1.0.0...v1.1.0)
8
+ * [#9](https://github.com/westonganger/active_record_simple_execute/pull/9) - Automatically switch between `select_all` and `exec_query` based on if query is read or write, update readme examples with new knowledge around `Arel.sql` vs `sanitize_sql_array`
9
+
7
10
  - v1.0.0 - Oct 17, 2024 - [View Diff](https://github.com/westonganger/active_record_simple_execute/compare/v0.9.1...v1.0.0)
8
11
  * [#8](https://github.com/westonganger/active_record_simple_execute/pull/8) - Allow usage with different Active Record database connections
9
12
  * [#7](https://github.com/westonganger/active_record_simple_execute/pull/7) - Drop support for Rails 5.1 and below
data/README.md CHANGED
@@ -6,6 +6,8 @@
6
6
 
7
7
  Sanitize and Execute your raw SQL queries in ActiveRecord and Rails with a much more intuitive and shortened syntax.
8
8
 
9
+ This gem is in response to a lack of proper documentation of best practices within Rails - I've [created a documentation PR](https://github.com/rails/rails/pull/53719) to resolve this but until this this is merged this gem seems necessary for the eco-system.
10
+
9
11
  # Installation
10
12
 
11
13
  ```ruby
@@ -29,7 +31,7 @@ records = ActiveRecord::Base.connection.simple_execute(sql_str, company_id: @com
29
31
  # ActiveRecord::Base.simple_execute(...)
30
32
  ```
31
33
 
32
- ### Using original ActiveRecord `exec_query` method
34
+ ### Using original ActiveRecord `select_all` or `exec_query` method
33
35
  ```ruby
34
36
  sql_str = <<~SQL.squish
35
37
  SELECT *
@@ -37,16 +39,24 @@ sql_str = <<~SQL.squish
37
39
  WHERE orders.company_id = :company_id AND orders.updated_by_user_id = :user_id
38
40
  SQL
39
41
 
40
- sanitized_sql = ActiveRecord::Base.sanitize_sql_array([sql_str, company_id: @company.id, user_id: @user.id])
42
+ ### FOR READ OPERATIONS
43
+ sanitized_sql = Arel.sql(sql_str, company_id: @company.id, user_id: @user.id)
44
+ result = ActiveRecord::Base.connection.select_all(sanitized_sql)
41
45
 
42
- result = ActiveRecord::Base.connection.exec_query(sanitized_sql)
46
+ ### OR FOR WRITE OPERATIONS (you probably shouldnt be doing this anyways)
47
+ ### (while exec_query is capable of read & write operations, recommended only for write operations as it affects the query cache)
48
+ sanitized_sql = ActiveRecord::Base.sanitize_sql_array([sql_str, {company_id: @company.id, user_id: @user.id}]) # Must use sanitize_sql_array, since Arel.sql is not yet compatible with `exec_query`
49
+ result = ActiveRecord::Base.connection.exec_query(sanitized_sql) # recommended only for write operations as it affects the query cache
43
50
 
44
- records = result.to_a
51
+ records = result.to_a # convert the ActiveRecord::Result object into an array of hashes
45
52
 
46
53
  return records
47
54
  ```
48
55
 
49
56
  ### Using original ActiveRecord `execute` method
57
+
58
+ It should be noted that it is recommended to avoid all usage of `execute` and to instead use `select_all` or `exec_query` which returns generic ActiveRecord::Result objects
59
+
50
60
  ```ruby
51
61
  sql_str = <<~SQL.squish
52
62
  SELECT *
@@ -54,11 +64,10 @@ sql_str = <<~SQL.squish
54
64
  WHERE orders.company_id = :company_id AND orders.updated_by_user_id = :user_id
55
65
  SQL
56
66
 
57
- sanitized_sql = ActiveRecord::Base.sanitize_sql_array([sql_str, company_id: @company.id, user_id: @user.id])
67
+ # Must use sanitize_sql_array, since Arel.sql is not yet compatible with `execute`
68
+ sanitized_sql = ActiveRecord::Base.sanitize_sql_array([sql_str, {company_id: @company.id, user_id: @user.id}])
58
69
 
59
70
  result = ActiveRecord::Base.connection.execute(sanitized_sql)
60
- # OR
61
- result = ActiveRecord::Base.connection.exec_query(sanitized_sql)
62
71
 
63
72
  if defined?(PG::Result) && result.is_a?(PG::Result)
64
73
  records = result.to_a
@@ -1,3 +1,3 @@
1
1
  module ActiveRecordSimpleExecute
2
- VERSION = "1.0.0".freeze
2
+ VERSION = "1.1.0".freeze
3
3
  end
@@ -6,9 +6,21 @@ ActiveSupport.on_load(:active_record) do
6
6
 
7
7
  ActiveRecord::ConnectionAdapters::DatabaseStatements.module_eval do
8
8
  def simple_execute(sql_str, **sql_vars)
9
- sanitized_sql = ActiveRecord::Base.sanitize_sql_array([sql_str, **sql_vars])
10
-
11
- query_result = exec_query(sanitized_sql)
9
+ readonly = sql_str.strip.downcase.start_with?("select ")
10
+
11
+ if readonly
12
+ if Rails::VERSION::STRING.to_f >= 7.1
13
+ sanitized_sql = Arel.sql(sql_str, **sql_vars)
14
+ else
15
+ sanitized_sql = ActiveRecord::Base.sanitize_sql_array([sql_str, **sql_vars])
16
+ end
17
+ query_result = select_all(sanitized_sql)
18
+ else
19
+ # Must use sanitize_sql_array, since Arel.sql is not yet compatible with `exec_query` or `execute`, https://github.com/rails/rails/pull/53740
20
+
21
+ sanitized_sql = ActiveRecord::Base.sanitize_sql_array([sql_str, **sql_vars])
22
+ query_result = exec_query(sanitized_sql)
23
+ end
12
24
 
13
25
  records = query_result.to_a
14
26
 
metadata CHANGED
@@ -1,14 +1,14 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: active_record_simple_execute
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.1.0
5
5
  platform: ruby
6
6
  authors:
7
7
  - Weston Ganger
8
8
  autorequire:
9
9
  bindir: bin
10
10
  cert_chain: []
11
- date: 2024-10-17 00:00:00.000000000 Z
11
+ date: 2024-11-27 00:00:00.000000000 Z
12
12
  dependencies:
13
13
  - !ruby/object:Gem::Dependency
14
14
  name: activerecord