ar_virtual_field 1.0.0 → 1.0.2

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: 1d194e101e0b3a130c12bc06a51379de261e0e57dafd118492383048af768c6a
4
- data.tar.gz: ea906b4039f95176535b765fafc438aa95f8c7933575a2f4477e242e8203dda3
3
+ metadata.gz: cc1842359c967930d4e5a6c9e45c69897d064ed8b35d8a4d5ce9e86985796794
4
+ data.tar.gz: ac6c1e0d05446db0ddc88d369bd799ceb384c0a141774ab3c7b43bcb0f3506da
5
5
  SHA512:
6
- metadata.gz: a013511eb25261677a2a593b1dfd28e60b8f7620a23c1f59f213984c42341b44cfe5cd0e40b028a50d1259657bc24e0215811b2105931ed23b6269fcc12e7ddb
7
- data.tar.gz: edbfc3f31cf25aafad70d46b5d74720e12cc2dd53915eb1d393d068199b7c0142b4de57c1ff99a9620337a81a55487f45fbbdd98a4bdce6227c4694b0b2c6354
6
+ metadata.gz: 6fbc0e108fc8ccfc8ef5889b11b5b66326cfeb57399c686b93139fbb92b126df8196add0fab124d237291dcbf405d43651057c161d5f533b849495217eb6fcbd
7
+ data.tar.gz: ffd519768bc3fcf5f4b7abd5dacd030e6265f1cbaf07d92d7137b7b6aa94f1d02dc8294c86e644ec6a559b71e95891f5c2f23e786051880b63ca11d2086a2b88
data/README.md CHANGED
@@ -19,11 +19,11 @@ gem 'ar_virtual_field'
19
19
  To define a virtual field, use the virtual_field method in your model:
20
20
 
21
21
  ```ruby
22
- virtual_field :virtual_attribute,
22
+ virtual_field :virtual_attribute,
23
23
  scope: -> { joins(:related_model).where(related_models: { some_column: value }) },
24
24
  select: -> { "SUM(related_models.some_value)" },
25
25
  get: -> { calculate_some_value },
26
- default: 0
26
+ default: '0'
27
27
  ```
28
28
 
29
29
  Parameters:
@@ -31,7 +31,7 @@ Parameters:
31
31
  - `scope`: A lambda defining a scope that fetches the virtual field value (optional).
32
32
  - `select`: SQL selection logic (can be a string or arel node or a lambda returning a string or arel_node) to define how the field is computed.
33
33
  - `get`: A method to retrieve the value of the virtual field when the field isn't fetched via SQL.
34
- - `default`: A default value for the virtual field if the result is nil (optional).
34
+ - `default`: A default value(can be a string or arel node or a lambda returning a string or arel_node) for the virtual field if the result is nil (optional).
35
35
 
36
36
  Example:
37
37
 
@@ -41,7 +41,7 @@ class User < ApplicationRecord
41
41
  scope: -> { joins(:orders).group(:id) },
42
42
  select: "COUNT(orders.id)",
43
43
  get: -> { orders.count },
44
- default: 0
44
+ default: '0'
45
45
 
46
46
  virtual_field :fullname,
47
47
  select: "name || surname",
@@ -1,5 +1,5 @@
1
1
  # frozen_string_literal: true
2
2
 
3
3
  module ArVirtualField
4
- VERSION = "1.0.0"
4
+ VERSION = "1.0.2"
5
5
  end
@@ -59,18 +59,17 @@ module ArVirtualField
59
59
  default = HelperMethods.wrap_to_lambda(default)
60
60
  end
61
61
 
62
- select = HelperMethods.wrap_to_lambda(select)
63
-
64
- select_lambda = -> do
65
- if default
66
- Arel::Nodes::NamedFunction.new('COALESCE', [select.(), default.()])
67
- else
68
- select.()
69
- end
70
- end
62
+ select_lambda = HelperMethods.wrap_to_lambda(select)
71
63
 
72
64
  if scope
73
- @ar_virtual_fields[name.to_sym] = -> { Arel.sql(HelperMethods.table_with_column(name)) }
65
+ field_name = Arel.sql(HelperMethods.table_with_column(name))
66
+
67
+ @ar_virtual_fields[name.to_sym] =
68
+ if default
69
+ -> { Arel::Nodes::NamedFunction.new('COALESCE', [field_name, default.()]) }
70
+ else
71
+ -> { field_name }
72
+ end
74
73
 
75
74
  scope_name = :"_scope_#{name}"
76
75
 
@@ -91,6 +90,10 @@ module ArVirtualField
91
90
  SQL
92
91
  end)
93
92
  else
93
+ if default
94
+ select_lambda = -> { Arel::Nodes::NamedFunction.new('COALESCE', [select_lambda.(), default.()]) }
95
+ end
96
+
94
97
  @ar_virtual_fields[name.to_sym] = -> { select_lambda.() }
95
98
 
96
99
  scope(:"with_#{name}", -> do
@@ -103,7 +106,7 @@ module ArVirtualField
103
106
  define_method(method_name, &get)
104
107
  define_method(name) do
105
108
  if ActiveRecord::Base.connection.query_cache_enabled
106
- attributes.key?(name) ? (self[name] || default) : send(method_name)
109
+ attributes.key?(name) ? self[name] : send(method_name)
107
110
  else
108
111
  send(method_name)
109
112
  end
metadata CHANGED
@@ -1,14 +1,13 @@
1
1
  --- !ruby/object:Gem::Specification
2
2
  name: ar_virtual_field
3
3
  version: !ruby/object:Gem::Version
4
- version: 1.0.0
4
+ version: 1.0.2
5
5
  platform: ruby
6
6
  authors:
7
7
  - Pavel Egorov
8
- autorequire:
9
8
  bindir: bin
10
9
  cert_chain: []
11
- date: 2025-05-06 00:00:00.000000000 Z
10
+ date: 1980-01-02 00:00:00.000000000 Z
12
11
  dependencies:
13
12
  - !ruby/object:Gem::Dependency
14
13
  name: activerecord
@@ -69,7 +68,6 @@ licenses:
69
68
  metadata:
70
69
  homepage_uri: https://github.com/emfy0/ar_virtual_field
71
70
  source_code_uri: https://github.com/emfy0/ar_virtual_field
72
- post_install_message:
73
71
  rdoc_options: []
74
72
  require_paths:
75
73
  - lib
@@ -84,8 +82,7 @@ required_rubygems_version: !ruby/object:Gem::Requirement
84
82
  - !ruby/object:Gem::Version
85
83
  version: '0'
86
84
  requirements: []
87
- rubygems_version: 3.5.22
88
- signing_key:
85
+ rubygems_version: 3.6.8
89
86
  specification_version: 4
90
87
  summary: Provide an easy mechanism to define virtual fields within an ActiveRecord
91
88
  model