hydra_attribute 0.4.0.rc1 → 0.4.0.rc2
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 +65 -35
- data/features/entity/create.feature +17 -0
- data/features/relation/query_methods/where.feature +46 -1
- data/features/step_definitions/model_steps.rb +13 -0
- data/gemfiles/3.1.gemfile.lock +13 -13
- data/gemfiles/3.2.gemfile.lock +13 -13
- data/lib/hydra_attribute/active_record/attribute_methods.rb +4 -5
- data/lib/hydra_attribute/active_record/relation/query_methods.rb +7 -1
- data/lib/hydra_attribute/builder.rb +3 -3
- data/lib/hydra_attribute/hydra_attribute.rb +4 -4
- data/lib/hydra_attribute/hydra_attribute_methods.rb +146 -5
- data/lib/hydra_attribute/hydra_methods.rb +420 -15
- data/lib/hydra_attribute/hydra_set_methods.rb +57 -1
- data/lib/hydra_attribute/hydra_value_methods.rb +7 -0
- data/lib/hydra_attribute/{memoize.rb → memoizable.rb} +1 -1
- data/lib/hydra_attribute/version.rb +1 -1
- data/lib/hydra_attribute.rb +1 -1
- data/spec/hydra_attribute/active_record/attribute_methods_spec.rb +17 -0
- data/spec/{hydra_attribute_methods_spec.rb → hydra_attribute/hydra_attribute_methods_spec.rb} +0 -0
- data/spec/{hydra_attribute_spec.rb → hydra_attribute/hydra_attribute_spec.rb} +0 -0
- data/spec/{hydra_methods_spec.rb → hydra_attribute/hydra_methods_spec.rb} +22 -23
- data/spec/{hydra_set_methods_spec.rb → hydra_attribute/hydra_set_methods_spec.rb} +0 -0
- data/spec/{hydra_set_spec.rb → hydra_attribute/hydra_set_spec.rb} +0 -0
- data/spec/{memoize_spec.rb → hydra_attribute/memoizable_spec.rb} +2 -2
- metadata +67 -30
data/README.md
CHANGED
@@ -1,8 +1,9 @@
|
|
1
|
-
# hydra_attribute
|
2
|
-
|
1
|
+
# hydra_attribute [](http://travis-ci.org/kostyantyn/hydra_attribute)
|
2
|
+
|
3
|
+
[Wiki](https://github.com/kostyantyn/hydra_attribute/wiki) | [RDoc](http://rdoc.info/github/kostyantyn/hydra_attribute)
|
3
4
|
|
4
5
|
hydra_attribute is an implementation of
|
5
|
-
[EAV pattern](http://en.wikipedia.org/wiki/Entity–attribute–value_model) for ActiveRecord models.
|
6
|
+
[EAV (Entity-Attribute-Value) pattern](http://en.wikipedia.org/wiki/Entity–attribute–value_model) for ActiveRecord models. It allows to create or remove attributes in runtime. Also each record may have different sets of attributes, for example: Product with ID 1 can have different set of attributes than Product with ID 2.
|
6
7
|
|
7
8
|
## Requirements
|
8
9
|
* ruby >= 1.9.2
|
@@ -36,7 +37,8 @@ class CreateHydraAttributeTables < ActiveRecord::Migration
|
|
36
37
|
end
|
37
38
|
```
|
38
39
|
|
39
|
-
|
40
|
+
**or if we have already the entity table**
|
41
|
+
|
40
42
|
```ruby
|
41
43
|
class CreateHydraAttributeTables < ActiveRecord::Migration
|
42
44
|
def up
|
@@ -51,7 +53,7 @@ end
|
|
51
53
|
|
52
54
|
## Usage
|
53
55
|
|
54
|
-
|
56
|
+
### Create model
|
55
57
|
```shell
|
56
58
|
rails generate model Product type:string name:string --migration=false
|
57
59
|
rake db:migrate
|
@@ -71,7 +73,7 @@ class Product < ActiveRecord::Base
|
|
71
73
|
end
|
72
74
|
```
|
73
75
|
|
74
|
-
|
76
|
+
### Create hydra attributes
|
75
77
|
```ruby
|
76
78
|
Product.hydra_attributes.create(name: 'color', backend_type: 'string', default_value: 'green')
|
77
79
|
Product.hydra_attributes.create(name: 'title', backend_type: 'string')
|
@@ -88,57 +90,85 @@ Creating method accepts the following options:
|
|
88
90
|
Product.hydra_attributes.create({name: 'title', backend_type: 'string', white_list: true}, as: :admin)
|
89
91
|
```
|
90
92
|
|
91
|
-
|
92
|
-
|
93
|
+
### Create records
|
93
94
|
```ruby
|
94
|
-
Product.create
|
95
|
-
|
96
|
-
Product.create(color: 'red', title: 'toy')
|
97
|
-
|
98
|
-
Product.create(title: 'book', total: 2)
|
99
|
-
|
95
|
+
Product.create
|
96
|
+
#<Product id: 1, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "green", title: nil, total: 1>
|
97
|
+
Product.create(color: 'red', title: 'toy')
|
98
|
+
#<Product id: 2, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "red", title: "toy", total: 1>
|
99
|
+
Product.create(title: 'book', total: 2)
|
100
|
+
#<Product id: 3, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "green", title: "book", total: 2>
|
100
101
|
```
|
101
102
|
|
102
|
-
|
103
|
+
### Add new hydra attribute in runtime
|
103
104
|
```ruby
|
104
105
|
Product.hydra_attributes.create(name: 'price', backend_type: 'float', default_value: 0.0)
|
105
|
-
Product.create(title: 'car', price: 2.50)
|
106
|
-
|
106
|
+
Product.create(title: 'car', price: 2.50)
|
107
|
+
#<Product id: 4, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "green", title: "car", total: 2, price: 2.5>
|
108
|
+
```
|
109
|
+
|
110
|
+
### Create hydra set
|
111
|
+
**Hydra set** allows set unique attribute list for each entity.
|
112
|
+
|
113
|
+
```ruby
|
114
|
+
hydra_set = Product.hydra_sets.create(name: 'Default')
|
115
|
+
hydra_set.hydra_attributes = Product.hydra_attributes.where(name: %w(color title price))
|
116
|
+
|
117
|
+
Product.create(color: 'black', title: 'ipod', price: 49.95, total: 5) do |product|
|
118
|
+
product.hydra_set_id = hydra_set.id
|
119
|
+
end
|
120
|
+
#<Product id: 5, hydra_set_id: 1, created_at: ..., updated_at: ..., color: "black", title: "ipod", price: 49.95>
|
107
121
|
```
|
122
|
+
**Notice:** the `total` attribute was skipped because it doesn't exist in hydra set.
|
108
123
|
|
109
|
-
|
124
|
+
### Obtain data
|
110
125
|
```ruby
|
111
|
-
Product.where(color: 'red')
|
112
|
-
# [
|
113
|
-
Product.where(color: 'green', price: nil)
|
114
|
-
# [
|
115
|
-
|
126
|
+
Product.where(color: 'red')
|
127
|
+
# [#<Product id: 2, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "red", title: "toy", price: 0.0, total: 1>]
|
128
|
+
Product.where(color: 'green', price: nil)
|
129
|
+
# [
|
130
|
+
#<Product id: 1, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "green", title: nil, price: 0.0, total: 1>,
|
131
|
+
#<Product id: 3, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "green", title: "book", price: 0.0, total: 2>
|
132
|
+
# ]
|
116
133
|
```
|
117
134
|
**Notice**: the attribute `price` was added in runtime and records that were created before have not this attribute
|
118
135
|
so they matched this condition `where(price: nil)`
|
119
136
|
|
120
|
-
|
137
|
+
### Order data
|
121
138
|
```ruby
|
122
|
-
Product.order(:color).first
|
123
|
-
|
124
|
-
Product.order(:color).reverse_order.first
|
125
|
-
|
139
|
+
Product.order(:color, :title).first
|
140
|
+
#<Product id: 5, hydra_set_id: 1, created_at: ..., updated_at: ..., color: "black", title: "ipod", price: 49.95>
|
141
|
+
Product.order(:color, :title).reverse_order.first
|
142
|
+
#<Product id: 2, hydra_set_id: nil, created_at: ..., updated_at: ..., color: "red", title: "toy", price: 0.0, total: 1>
|
126
143
|
```
|
127
144
|
|
128
|
-
|
145
|
+
### Select concrete attributes
|
129
146
|
```ruby
|
130
|
-
Product.select([:color, :title])
|
131
|
-
# [
|
132
|
-
|
147
|
+
Product.select([:color, :title])
|
148
|
+
# [
|
149
|
+
#<Product id: 1, hydra_set_id: nil, color: "green", title: nil>,
|
150
|
+
#<Product id: 2, hydra_set_id: nil, color: "red", title: "toy">,
|
151
|
+
#<Product id: 3, hydra_set_id: nil, color: "green", title: "book">,
|
152
|
+
#<Product id: 4, hydra_set_id: nil, color: "green", title: "car">,
|
153
|
+
#<Product id: 5, hydra_set_id: 1, color: "black", title: "ipod">
|
154
|
+
# ]
|
133
155
|
```
|
134
|
-
**Notice
|
156
|
+
**Notice:** `id` and `hydra_set_id` attributes are forced added because they are important for correct work.
|
135
157
|
|
136
|
-
|
158
|
+
### Group by attribute
|
137
159
|
```ruby
|
138
160
|
Product.group(:color).count
|
139
|
-
# {"green"=>3, "red"=>1}
|
161
|
+
# {"black"=>1, "green"=>3, "red"=>1}
|
140
162
|
```
|
141
163
|
|
164
|
+
## Wiki Docs
|
165
|
+
* [Create migration](https://github.com/kostyantyn/hydra_attribute/wiki/Create-migration)
|
166
|
+
* [Create attributes in runtime](https://github.com/kostyantyn/hydra_attribute/wiki/Create-attributes-in-runtime)
|
167
|
+
* [Create sets of attributes](https://github.com/kostyantyn/hydra_attribute/wiki/Create-sets-of-attributes)
|
168
|
+
* [Query methods](https://github.com/kostyantyn/hydra_attribute/wiki/Query-methods)
|
169
|
+
* [Database schema](https://github.com/kostyantyn/hydra_attribute/wiki/Database-schema)
|
170
|
+
* [Helper methods](https://github.com/kostyantyn/hydra_attribute/wiki/Helper-methods)
|
171
|
+
|
142
172
|
## Notice
|
143
173
|
|
144
174
|
The each new minor version doesn't guarantee back compatibility with previous one
|
@@ -53,6 +53,23 @@ Feature: create models with hydra attributes
|
|
53
53
|
| info | b |
|
54
54
|
| started | [date:2012-05-05] |
|
55
55
|
|
56
|
+
Scenario: create hydra attribute in runtime
|
57
|
+
# create product to cache all hydra attributes
|
58
|
+
Given create "Product" model
|
59
|
+
And create hydra attributes for "Product" with role "admin" as "hashes":
|
60
|
+
| name | backend_type | default_value | white_list |
|
61
|
+
| quantity | integer | [nil:] | [bool:t] |
|
62
|
+
And create "Product" model with attributes as "rows_hash":
|
63
|
+
| quantity | 5 |
|
64
|
+
Then last created "Product" should have the following attributes:
|
65
|
+
| code | [nil:] |
|
66
|
+
| info | [str:] |
|
67
|
+
| price | [float:0] |
|
68
|
+
| total | [int:0] |
|
69
|
+
| active | [bool:f] |
|
70
|
+
| started | [date:2012-01-01] |
|
71
|
+
| quantity | [int:5] |
|
72
|
+
|
56
73
|
Scenario: pass only hydra_set_id
|
57
74
|
Given create hydra sets for "Product" as "hashes":
|
58
75
|
| name |
|
@@ -67,4 +67,49 @@ Feature: hydra attribute where conditions
|
|
67
67
|
And records should have the following attributes:
|
68
68
|
| field | value |
|
69
69
|
| code | 2 |
|
70
|
-
| code | 3 |
|
70
|
+
| code | 3 |
|
71
|
+
|
72
|
+
Scenario: select entity if it has attribute in attribute set
|
73
|
+
Given create hydra set "Default" for "Product"
|
74
|
+
And set hydra attributes "[array:code,title]" to hydra set "Default" for entity "Product"
|
75
|
+
And create "Product" models with attributes as "hashes":
|
76
|
+
| hydra_set_id | code | title |
|
77
|
+
| | abc1 | book |
|
78
|
+
| [eval:Product.hydra_set('Default').id] | abc2 | book |
|
79
|
+
When filter "Product" by:
|
80
|
+
| field | value |
|
81
|
+
| title | book |
|
82
|
+
Then total records should be "2"
|
83
|
+
And records should have the following attributes:
|
84
|
+
| field | value |
|
85
|
+
| code | abc1 |
|
86
|
+
| code | abc2 |
|
87
|
+
|
88
|
+
Scenario: when filter attribute by nil value then entities without this attribute in attribute set should not be selected
|
89
|
+
Given create hydra set "Default" for "Product"
|
90
|
+
And create "Product" model
|
91
|
+
And create "Product" model with attributes as "rows_hash":
|
92
|
+
| hydra_set_id | [eval:Product.hydra_set('Default').id] |
|
93
|
+
When filter "Product" by:
|
94
|
+
| field | value |
|
95
|
+
| code | [nil:] |
|
96
|
+
Then total records should be "1"
|
97
|
+
And records should have the following attributes:
|
98
|
+
| field | value |
|
99
|
+
| hydra_set_id | [nil:] |
|
100
|
+
|
101
|
+
Scenario: when filter attribute by value then entities which don't have this attribute in attribute set any more should not be selected
|
102
|
+
Given create hydra set "Default" for "Product"
|
103
|
+
And add hydra attribute "code" to hydra set "Default" for entity "Product"
|
104
|
+
And create "Product" models with attributes as "hashes":
|
105
|
+
| hydra_set_id | code |
|
106
|
+
| | abc |
|
107
|
+
| [eval:Product.hydra_set('Default').id] | abc |
|
108
|
+
And set hydra attributes "title" to hydra set "Default" for entity "Product"
|
109
|
+
When filter "Product" by:
|
110
|
+
| field | value |
|
111
|
+
| code | abc |
|
112
|
+
Then total records should be "1"
|
113
|
+
And records should have the following attributes:
|
114
|
+
| field | value |
|
115
|
+
| hydra_set_id | [nil:] |
|
@@ -66,6 +66,19 @@ Given /^add "([^"]+)" hydra attributes to hydra set:$/ do |klass, table|
|
|
66
66
|
end
|
67
67
|
end
|
68
68
|
|
69
|
+
Given /^add hydra attribute "([^"]+)" to hydra set "([^"]+)" for entity "([^"]+)"$/ do |hydra_attribute, hydra_set, entity_class|
|
70
|
+
entity = entity_class.constantize
|
71
|
+
entity.hydra_set(type_cast_value(hydra_set)).hydra_attributes << entity.hydra_attribute(type_cast_value(hydra_attribute))
|
72
|
+
end
|
73
|
+
|
74
|
+
Given /^set hydra attributes? "([^"]+)" to hydra set "([^"]+)" for entity "([^"]+)"$/ do |hydra_attributes, hydra_set, entity_class|
|
75
|
+
entity = entity_class.constantize
|
76
|
+
hydra_set = entity.hydra_set(type_cast_value(hydra_set))
|
77
|
+
|
78
|
+
hydra_attributes = Array(type_cast_value(hydra_attributes)).map { |attr| entity.hydra_attribute(attr) }
|
79
|
+
hydra_set.hydra_attributes = hydra_attributes
|
80
|
+
end
|
81
|
+
|
69
82
|
Given /^(load and )?(save|create|update(?: all| attributes)?|destroy(?: all)?|delete(?: all)?)(?: for)? "([^"]+)" models? with attributes as "([^"]+)":$/ do |load, action, klass, format, table|
|
70
83
|
action = action.gsub(' ', '_')
|
71
84
|
klass = klass.constantize
|
data/gemfiles/3.1.gemfile.lock
CHANGED
@@ -1,28 +1,28 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/kostyantyn/Sites/github/gems/hydra_attribute
|
3
3
|
specs:
|
4
|
-
hydra_attribute (0.4.0.
|
4
|
+
hydra_attribute (0.4.0.rc1)
|
5
5
|
activerecord (>= 3.1.0)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: http://rubygems.org/
|
9
9
|
specs:
|
10
|
-
activemodel (3.1.
|
11
|
-
activesupport (= 3.1.
|
10
|
+
activemodel (3.1.8)
|
11
|
+
activesupport (= 3.1.8)
|
12
12
|
builder (~> 3.0.0)
|
13
13
|
i18n (~> 0.6)
|
14
|
-
activerecord (3.1.
|
15
|
-
activemodel (= 3.1.
|
16
|
-
activesupport (= 3.1.
|
14
|
+
activerecord (3.1.8)
|
15
|
+
activemodel (= 3.1.8)
|
16
|
+
activesupport (= 3.1.8)
|
17
17
|
arel (~> 2.2.3)
|
18
18
|
tzinfo (~> 0.3.29)
|
19
|
-
activesupport (3.1.
|
19
|
+
activesupport (3.1.8)
|
20
20
|
multi_json (>= 1.0, < 1.3)
|
21
21
|
appraisal (0.4.1)
|
22
22
|
bundler
|
23
23
|
rake
|
24
24
|
arel (2.2.3)
|
25
|
-
builder (3.0.
|
25
|
+
builder (3.0.3)
|
26
26
|
cucumber (1.2.1)
|
27
27
|
builder (>= 2.1.2)
|
28
28
|
diff-lcs (>= 1.1.3)
|
@@ -30,10 +30,10 @@ GEM
|
|
30
30
|
json (>= 1.4.6)
|
31
31
|
database_cleaner (0.8.0)
|
32
32
|
diff-lcs (1.1.3)
|
33
|
-
gherkin (2.11.
|
33
|
+
gherkin (2.11.2)
|
34
34
|
json (>= 1.4.6)
|
35
|
-
i18n (0.6.
|
36
|
-
json (1.7.
|
35
|
+
i18n (0.6.1)
|
36
|
+
json (1.7.5)
|
37
37
|
multi_json (1.2.0)
|
38
38
|
rake (0.9.2.2)
|
39
39
|
rspec (2.11.0)
|
@@ -41,9 +41,9 @@ GEM
|
|
41
41
|
rspec-expectations (~> 2.11.0)
|
42
42
|
rspec-mocks (~> 2.11.0)
|
43
43
|
rspec-core (2.11.1)
|
44
|
-
rspec-expectations (2.11.
|
44
|
+
rspec-expectations (2.11.3)
|
45
45
|
diff-lcs (~> 1.1.3)
|
46
|
-
rspec-mocks (2.11.
|
46
|
+
rspec-mocks (2.11.2)
|
47
47
|
sqlite3 (1.3.6)
|
48
48
|
tzinfo (0.3.33)
|
49
49
|
|
data/gemfiles/3.2.gemfile.lock
CHANGED
@@ -1,28 +1,28 @@
|
|
1
1
|
PATH
|
2
2
|
remote: /Users/kostyantyn/Sites/github/gems/hydra_attribute
|
3
3
|
specs:
|
4
|
-
hydra_attribute (0.4.0.
|
4
|
+
hydra_attribute (0.4.0.rc1)
|
5
5
|
activerecord (>= 3.1.0)
|
6
6
|
|
7
7
|
GEM
|
8
8
|
remote: http://rubygems.org/
|
9
9
|
specs:
|
10
|
-
activemodel (3.2.
|
11
|
-
activesupport (= 3.2.
|
10
|
+
activemodel (3.2.8)
|
11
|
+
activesupport (= 3.2.8)
|
12
12
|
builder (~> 3.0.0)
|
13
|
-
activerecord (3.2.
|
14
|
-
activemodel (= 3.2.
|
15
|
-
activesupport (= 3.2.
|
13
|
+
activerecord (3.2.8)
|
14
|
+
activemodel (= 3.2.8)
|
15
|
+
activesupport (= 3.2.8)
|
16
16
|
arel (~> 3.0.2)
|
17
17
|
tzinfo (~> 0.3.29)
|
18
|
-
activesupport (3.2.
|
18
|
+
activesupport (3.2.8)
|
19
19
|
i18n (~> 0.6)
|
20
20
|
multi_json (~> 1.0)
|
21
21
|
appraisal (0.4.1)
|
22
22
|
bundler
|
23
23
|
rake
|
24
24
|
arel (3.0.2)
|
25
|
-
builder (3.0.
|
25
|
+
builder (3.0.3)
|
26
26
|
cucumber (1.2.1)
|
27
27
|
builder (>= 2.1.2)
|
28
28
|
diff-lcs (>= 1.1.3)
|
@@ -30,10 +30,10 @@ GEM
|
|
30
30
|
json (>= 1.4.6)
|
31
31
|
database_cleaner (0.8.0)
|
32
32
|
diff-lcs (1.1.3)
|
33
|
-
gherkin (2.11.
|
33
|
+
gherkin (2.11.2)
|
34
34
|
json (>= 1.4.6)
|
35
|
-
i18n (0.6.
|
36
|
-
json (1.7.
|
35
|
+
i18n (0.6.1)
|
36
|
+
json (1.7.5)
|
37
37
|
multi_json (1.3.6)
|
38
38
|
rake (0.9.2.2)
|
39
39
|
rspec (2.11.0)
|
@@ -41,9 +41,9 @@ GEM
|
|
41
41
|
rspec-expectations (~> 2.11.0)
|
42
42
|
rspec-mocks (~> 2.11.0)
|
43
43
|
rspec-core (2.11.1)
|
44
|
-
rspec-expectations (2.11.
|
44
|
+
rspec-expectations (2.11.3)
|
45
45
|
diff-lcs (~> 1.1.3)
|
46
|
-
rspec-mocks (2.11.
|
46
|
+
rspec-mocks (2.11.2)
|
47
47
|
sqlite3 (1.3.6)
|
48
48
|
tzinfo (0.3.33)
|
49
49
|
|
@@ -53,7 +53,7 @@ module HydraAttribute
|
|
53
53
|
generated_hydra_attribute_methods.module_eval <<-EOS, __FILE__, __LINE__ + 1
|
54
54
|
#{defn}
|
55
55
|
if hydra_set_id? and self.class.hydra_set_attribute_ids(hydra_set_id).exclude?(#{hydra_attribute.id})
|
56
|
-
raise MissingAttributeInHydraSetError,
|
56
|
+
raise MissingAttributeInHydraSetError, %(Hydra attribute "#{hydra_attribute.name}" does not exist in hydra set "\#{self.class.hydra_set(hydra_set_id).name}")
|
57
57
|
end
|
58
58
|
|
59
59
|
if value_model = hydra_value_model(#{hydra_attribute.id})
|
@@ -99,7 +99,7 @@ module HydraAttribute
|
|
99
99
|
attr_name = self.class.send(:attribute_method_matcher, name).attr_name
|
100
100
|
end
|
101
101
|
|
102
|
-
if
|
102
|
+
if self.class.hydra_attribute_names.include?(attr_name)
|
103
103
|
self.class.hydra_set_attribute_names(hydra_set_id).include?(attr_name)
|
104
104
|
else
|
105
105
|
super
|
@@ -136,9 +136,8 @@ module HydraAttribute
|
|
136
136
|
end
|
137
137
|
|
138
138
|
def inspect
|
139
|
-
attrs
|
140
|
-
|
141
|
-
"#<#{self.class} #{attrs.join(', ')}>"
|
139
|
+
attrs = hydra_value_models.map { |model| "#{model.hydra_attribute_name}: #{model.attribute_for_inspect('value')}" }
|
140
|
+
super.gsub(/>$/, ", #{attrs.join(', ')}>")
|
142
141
|
end
|
143
142
|
|
144
143
|
private
|
@@ -4,7 +4,7 @@ module HydraAttribute
|
|
4
4
|
module QueryMethods
|
5
5
|
extend ActiveSupport::Concern
|
6
6
|
|
7
|
-
MULTI_VALUE_METHODS = [:hydra_joins_aliases, :hydra_select_values]
|
7
|
+
MULTI_VALUE_METHODS = [:hydra_joins_aliases, :hydra_select_values, :hydra_attributes]
|
8
8
|
|
9
9
|
included do
|
10
10
|
attr_writer *MULTI_VALUE_METHODS
|
@@ -25,6 +25,7 @@ module HydraAttribute
|
|
25
25
|
opts.inject(self) do |relation, (name, value)|
|
26
26
|
if klass.hydra_attribute_names.include?(name.to_s)
|
27
27
|
relation, name = relation.clone, name.to_s
|
28
|
+
relation.hydra_attributes << name
|
28
29
|
relation.hydra_joins_aliases << hydra_helper.ref_alias(name, value)
|
29
30
|
relation.joins_values += hydra_helper.build_joins(name, value)
|
30
31
|
relation.where_values += build_where(hydra_helper.where_options(name, value))
|
@@ -58,6 +59,11 @@ module HydraAttribute
|
|
58
59
|
@select_values << hydra_helper.prepend_table_name('hydra_set_id')
|
59
60
|
end
|
60
61
|
|
62
|
+
if hydra_attributes.any?
|
63
|
+
hydra_sets = klass.hydra_sets.select { |hydra_set| hydra_set.hydra_attributes.any? { |attr| attr.name.in?(hydra_attributes) } }
|
64
|
+
@where_values << table[:hydra_set_id].in(hydra_sets.map(&:id)).or(table[:hydra_set_id].eq(nil))
|
65
|
+
end
|
66
|
+
|
61
67
|
super
|
62
68
|
end
|
63
69
|
|
@@ -20,7 +20,7 @@ module HydraAttribute
|
|
20
20
|
|
21
21
|
def build
|
22
22
|
build_associations
|
23
|
-
|
23
|
+
update_mass_assignment_security
|
24
24
|
end
|
25
25
|
|
26
26
|
private
|
@@ -30,8 +30,8 @@ module HydraAttribute
|
|
30
30
|
end
|
31
31
|
end
|
32
32
|
|
33
|
-
def
|
34
|
-
klass.hydra_attributes.each(&:
|
33
|
+
def update_mass_assignment_security
|
34
|
+
klass.hydra_attributes.each(&:update_mass_assignment_security)
|
35
35
|
end
|
36
36
|
end
|
37
37
|
end
|
@@ -19,17 +19,17 @@ module HydraAttribute
|
|
19
19
|
|
20
20
|
before_destroy :delete_dependent_values
|
21
21
|
after_commit :clear_entity_cache
|
22
|
-
after_commit :
|
22
|
+
after_commit :update_mass_assignment_security
|
23
23
|
|
24
24
|
# @COMPATIBILITY with 3.1.x association module is directly added to the class instead of including module
|
25
25
|
def hydra_sets_with_clearing_cache=(value)
|
26
26
|
self.hydra_sets_without_clearing_cache = value
|
27
|
-
|
27
|
+
entity_type.constantize.clear_hydra_method_cache!
|
28
28
|
value
|
29
29
|
end
|
30
30
|
alias_method_chain :hydra_sets=, :clearing_cache
|
31
31
|
|
32
|
-
def
|
32
|
+
def update_mass_assignment_security
|
33
33
|
if destroyed? or !white_list?
|
34
34
|
remove_from_white_list
|
35
35
|
else
|
@@ -44,7 +44,7 @@ module HydraAttribute
|
|
44
44
|
end
|
45
45
|
|
46
46
|
def clear_entity_cache
|
47
|
-
entity_type.constantize.
|
47
|
+
entity_type.constantize.reset_hydra_attribute_methods!
|
48
48
|
end
|
49
49
|
|
50
50
|
def add_to_white_list
|