rails_extend 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.
- checksums.yaml +4 -4
- data/LICENSE +20 -0
- data/README.md +46 -0
- data/config/locales/en.datetime.yml +17 -0
- data/config/locales/zh.datetime.yml +145 -0
- data/config/locales/zh.support.yml +52 -0
- data/lib/generators/rails_extend/ignore_generator.rb +27 -0
- data/lib/generators/rails_extend/migrations_generator.rb +33 -0
- data/lib/generators/rails_extend/remove_table_generator.rb +29 -0
- data/lib/generators/rails_extend/rename_module_generator.rb +29 -0
- data/lib/generators/rails_extend/templates/README.md +2 -0
- data/lib/generators/rails_extend/templates/initializer.rb.tt +10 -0
- data/lib/generators/rails_extend/templates/migration.rb.tt +35 -0
- data/lib/generators/rails_extend/templates/remove_table.rb.tt +9 -0
- data/lib/generators/rails_extend/templates/rename_module.rb.tt +9 -0
- data/lib/rails_extend/active_model/type_value.rb +26 -0
- data/lib/rails_extend/active_model.rb +3 -0
- data/lib/rails_extend/active_record/enum.rb +74 -0
- data/lib/rails_extend/active_record/extend.rb +200 -0
- data/lib/rails_extend/active_record/i18n.rb +31 -0
- data/lib/rails_extend/active_record/include.rb +29 -0
- data/lib/rails_extend/active_record/taxon.rb +29 -0
- data/lib/rails_extend/active_record/translation.rb +41 -0
- data/lib/rails_extend/active_record.rb +8 -0
- data/lib/rails_extend/active_storage/attachment.rb +16 -0
- data/lib/rails_extend/active_storage/blob_prepend.rb +40 -0
- data/lib/rails_extend/active_storage/variant.rb +16 -0
- data/lib/rails_extend/active_storage.rb +5 -0
- data/lib/rails_extend/config.rb +19 -0
- data/lib/rails_extend/core/array.rb +79 -0
- data/lib/rails_extend/core/date.rb +32 -0
- data/lib/rails_extend/core/duration.rb +12 -0
- data/lib/rails_extend/core/hash.rb +106 -0
- data/lib/rails_extend/core/module.rb +7 -0
- data/lib/rails_extend/core/nil.rb +11 -0
- data/lib/rails_extend/core/numeric.rb +11 -0
- data/lib/rails_extend/core/pathname.rb +15 -0
- data/lib/rails_extend/core/string.rb +15 -0
- data/lib/rails_extend/core/time_format.rb +20 -0
- data/lib/rails_extend/core.rb +17 -0
- data/lib/rails_extend/engine.rb +13 -0
- data/lib/rails_extend/env.rb +10 -0
- data/lib/rails_extend/generators/named_base.rb +22 -0
- data/lib/rails_extend/generators.rb +3 -0
- data/lib/rails_extend/models.rb +120 -0
- data/lib/rails_extend/quiet_logs.rb +22 -0
- data/lib/rails_extend/routes.rb +81 -0
- data/lib/rails_extend/type/i18n.rb +23 -0
- data/lib/rails_extend/type/taxon.rb +15 -0
- data/lib/rails_extend/type.rb +4 -0
- data/lib/rails_extend.rb +19 -0
- data/lib/templates/test_unit/model/fixtures.yml.tt +15 -0
- data/lib/templates/test_unit/model/unit_test.rb.tt +7 -0
- metadata +56 -5
- data/lib/active_model/type_value.rb +0 -20
checksums.yaml
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
---
|
2
2
|
SHA256:
|
3
|
-
metadata.gz:
|
4
|
-
data.tar.gz:
|
3
|
+
metadata.gz: 14d1782a27b364e822118d37e190402e57785f1d797da73ac4307b94534caeea
|
4
|
+
data.tar.gz: 6f65c751e6b69b1093f53b7c4b646b14a0b9d5df70ac8feefba7cb718affebf8
|
5
5
|
SHA512:
|
6
|
-
metadata.gz:
|
7
|
-
data.tar.gz:
|
6
|
+
metadata.gz: 527e0bedcc3e428fa42d9b6a7cec61a0948f486d48708e4b2066552ab144bf2d52fb0f20fcb6f763fc952ea8070db36d9b8c759905939e3c796fa4354bc91bfc
|
7
|
+
data.tar.gz: 916b0e47282b51940ab35aff249d54122530e13b2f155dee4e0de52b7d83c4a18d236ce1321eea3bf08ddebfe29f6096100887c89a395c020e6822feb0750c6b
|
data/LICENSE
ADDED
@@ -0,0 +1,20 @@
|
|
1
|
+
Copyright (c) 2021-Present Mingyuan Qin <mingyuan0715@foxmail.com>
|
2
|
+
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining
|
4
|
+
a copy of this software and associated documentation files (the
|
5
|
+
"Software"), to deal in the Software without restriction, including
|
6
|
+
without limitation the rights to use, copy, modify, merge, publish,
|
7
|
+
distribute, sublicense, and/or sell copies of the Software, and to
|
8
|
+
permit persons to whom the Software is furnished to do so, subject to
|
9
|
+
the following conditions:
|
10
|
+
|
11
|
+
The above copyright notice and this permission notice shall be
|
12
|
+
included in all copies or substantial portions of the Software.
|
13
|
+
|
14
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
15
|
+
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
16
|
+
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
17
|
+
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
18
|
+
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
19
|
+
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
20
|
+
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
data/README.md
ADDED
@@ -0,0 +1,46 @@
|
|
1
|
+
# RailsExtend
|
2
|
+
|
3
|
+
[](https://github.com/work-design/rails_extend/actions/workflows/test.yml)
|
4
|
+
[](https://github.com/work-design/rails_extend/actions/workflows/cd.yml)
|
5
|
+
[](https://github.com/work-design/rails_extend/actions/workflows/gempush.yml)
|
6
|
+
|
7
|
+
Rails 通用基础库,对 Rails 的各个组件进行了扩展。
|
8
|
+
|
9
|
+
## 功能模块
|
10
|
+
* Ruby 核心类扩展,[链接](lib/rails_extend/core)
|
11
|
+
* Rails 核心类扩展
|
12
|
+
* ActiveStorage:[链接](lib/rails_com/active_storage)
|
13
|
+
* 通过 url 同步文件;
|
14
|
+
* 将文件复制到镜像服务器;
|
15
|
+
* Rails 元信息:
|
16
|
+
* [Model](lib/rails_extend/models.rb)
|
17
|
+
* [Routes / Controllers](lib/rails_extend/routes)
|
18
|
+
|
19
|
+
## 支持 enum
|
20
|
+
```yaml
|
21
|
+
# zh.yml
|
22
|
+
activerecord:
|
23
|
+
enum:
|
24
|
+
notification:
|
25
|
+
receiver_type:
|
26
|
+
User: 全体用户
|
27
|
+
Member: 成员
|
28
|
+
```
|
29
|
+
|
30
|
+
```ruby
|
31
|
+
t.select :receiver_type, options_for_select(Notification.options_i18n(:receiver_type))
|
32
|
+
```
|
33
|
+
|
34
|
+
* Override
|
35
|
+
```yaml
|
36
|
+
activerecord:
|
37
|
+
enum:
|
38
|
+
notification:
|
39
|
+
receiver_type:
|
40
|
+
User: 全体用户
|
41
|
+
Member: # remain this blank
|
42
|
+
```
|
43
|
+
|
44
|
+
|
45
|
+
## 版权
|
46
|
+
遵循 [MIT](https://opensource.org/licenses/MIT) 协议
|
@@ -0,0 +1,17 @@
|
|
1
|
+
en:
|
2
|
+
durations:
|
3
|
+
years: years
|
4
|
+
months: months
|
5
|
+
weeks: weeks
|
6
|
+
days: days
|
7
|
+
hours: hours
|
8
|
+
minutes: minutes
|
9
|
+
seconds: seconds
|
10
|
+
duration:
|
11
|
+
years: year
|
12
|
+
months: month
|
13
|
+
weeks: week
|
14
|
+
days: day
|
15
|
+
hours: hour
|
16
|
+
minutes: minute
|
17
|
+
seconds: second
|
@@ -0,0 +1,145 @@
|
|
1
|
+
zh:
|
2
|
+
date:
|
3
|
+
formats:
|
4
|
+
default: '%Y-%m-%d'
|
5
|
+
short: '%b %d'
|
6
|
+
long: '%B %d, %Y'
|
7
|
+
day_names: [星期天, 星期一, 星期二, 星期三, 星期四, 星期五, 星期六]
|
8
|
+
abbr_day_names: [周日, 周一, 周二, 周三, 周四, 周五, 周六]
|
9
|
+
month_names: [~, 一月份, 二月份, 三月份, 四月份, 五月份, 六月份, 七月份, 八月份, 九月份, 十月份, 十一月, 十二月]
|
10
|
+
abbr_month_names: [~, 一月, 二月, 三月, 四月, 五月, 六月, 七月, 八月, 九月, 十月, 十一月, 十二月]
|
11
|
+
week_day:
|
12
|
+
monday:
|
13
|
+
name: 星期一
|
14
|
+
abbr: 周一
|
15
|
+
tuesday:
|
16
|
+
name: 星期二
|
17
|
+
abbr: 周二
|
18
|
+
wednesday:
|
19
|
+
name: 星期三
|
20
|
+
abbr: 周三
|
21
|
+
thursday:
|
22
|
+
name: 星期四
|
23
|
+
abbr: 周四
|
24
|
+
friday:
|
25
|
+
name: 星期五
|
26
|
+
abbr: 周五
|
27
|
+
saturday:
|
28
|
+
name: 星期六
|
29
|
+
abbr: 周六
|
30
|
+
sunday:
|
31
|
+
name: 星期日
|
32
|
+
abbr: 周日
|
33
|
+
month_day:
|
34
|
+
january:
|
35
|
+
name: 一月份
|
36
|
+
abbr: 一月
|
37
|
+
february:
|
38
|
+
name: 二月份
|
39
|
+
abbr: 二月
|
40
|
+
march:
|
41
|
+
name: 三月份
|
42
|
+
abbr: 三月
|
43
|
+
april:
|
44
|
+
name: 四月份
|
45
|
+
abbr: 四月
|
46
|
+
may:
|
47
|
+
name: 五月份
|
48
|
+
abbr: 五月
|
49
|
+
june:
|
50
|
+
name: 六月份
|
51
|
+
abbr: 六月
|
52
|
+
july:
|
53
|
+
name: 七月份
|
54
|
+
abbr: 七月
|
55
|
+
august:
|
56
|
+
name: 八月份
|
57
|
+
abbr: 八月
|
58
|
+
september:
|
59
|
+
name: 九月份
|
60
|
+
abbr: 九月
|
61
|
+
october:
|
62
|
+
name: 十月份
|
63
|
+
abbr: 十月
|
64
|
+
november:
|
65
|
+
name: 十一月份
|
66
|
+
abbr: 十一月
|
67
|
+
december:
|
68
|
+
name: 十二月份
|
69
|
+
abbr: 十二月
|
70
|
+
order:
|
71
|
+
- 年
|
72
|
+
- 月
|
73
|
+
- 天
|
74
|
+
distance_in_words:
|
75
|
+
zero: 今天
|
76
|
+
one: 明天
|
77
|
+
two: 后天
|
78
|
+
three: 大后天
|
79
|
+
other: '%{count} 天后'
|
80
|
+
time:
|
81
|
+
formats:
|
82
|
+
default: '%a, %d %b %Y %H:%M:%S %z'
|
83
|
+
short: '%d %b %H:%M'
|
84
|
+
long: '%B %d, %Y %H:%M'
|
85
|
+
am: 上午
|
86
|
+
pm: 下午
|
87
|
+
datetime:
|
88
|
+
distance_in_words:
|
89
|
+
half_a_minute: 半分钟
|
90
|
+
less_than_x_seconds:
|
91
|
+
one: 不到1秒
|
92
|
+
other: '不到%{count}秒'
|
93
|
+
x_seconds:
|
94
|
+
one: 1秒
|
95
|
+
other: '%{count}秒'
|
96
|
+
less_than_x_minutes:
|
97
|
+
one: 不到1分钟
|
98
|
+
other: '不到%{count}分钟'
|
99
|
+
x_minutes:
|
100
|
+
one: 1分钟
|
101
|
+
other: '%{count}分钟'
|
102
|
+
about_x_hours:
|
103
|
+
one: 1小时
|
104
|
+
other: '%{count}小时'
|
105
|
+
x_days:
|
106
|
+
one: 1天
|
107
|
+
other: '%{count}天'
|
108
|
+
about_x_months:
|
109
|
+
one: 1个月
|
110
|
+
other: '%{count}个月'
|
111
|
+
x_months:
|
112
|
+
one: 1个月
|
113
|
+
other: '%{count} months'
|
114
|
+
about_x_years:
|
115
|
+
one: 1年
|
116
|
+
other: '%{count} years'
|
117
|
+
over_x_years:
|
118
|
+
one: '超过1年'
|
119
|
+
other: '%{count} 年'
|
120
|
+
almost_x_years:
|
121
|
+
one: 'almost 1 year'
|
122
|
+
other: 'almost %{count} years'
|
123
|
+
prompts:
|
124
|
+
year: 年
|
125
|
+
month: 月
|
126
|
+
day: 日
|
127
|
+
hour: 小时
|
128
|
+
minute: 分钟
|
129
|
+
second: 秒
|
130
|
+
durations:
|
131
|
+
years: 年
|
132
|
+
months: 个月
|
133
|
+
weeks: 个周
|
134
|
+
days: 天
|
135
|
+
hours: 小时
|
136
|
+
minutes: 分钟
|
137
|
+
seconds: 秒
|
138
|
+
duration:
|
139
|
+
years: 年
|
140
|
+
months: 月
|
141
|
+
weeks: 周
|
142
|
+
days: 天
|
143
|
+
hours: 小时
|
144
|
+
minutes: 分钟
|
145
|
+
seconds: 秒
|
@@ -0,0 +1,52 @@
|
|
1
|
+
zh:
|
2
|
+
number:
|
3
|
+
human:
|
4
|
+
format:
|
5
|
+
# These five are to override number.format and are optional
|
6
|
+
# separator:
|
7
|
+
delimiter: ""
|
8
|
+
precision: 0
|
9
|
+
significant: false
|
10
|
+
strip_insignificant_zeros: false
|
11
|
+
# Used in number_to_human_size()
|
12
|
+
storage_units:
|
13
|
+
# Storage units output formatting.
|
14
|
+
# %u is the storage unit, %n is the number (default: 2 MB)
|
15
|
+
format: "%n %u"
|
16
|
+
units:
|
17
|
+
byte:
|
18
|
+
one: 字节
|
19
|
+
other: 字节
|
20
|
+
kb: KB
|
21
|
+
mb: MB
|
22
|
+
gb: GB
|
23
|
+
tb: TB
|
24
|
+
pb: PB
|
25
|
+
eb: EB
|
26
|
+
# Used in NumberHelper.number_to_human()
|
27
|
+
decimal_units:
|
28
|
+
format: "%n %u"
|
29
|
+
units:
|
30
|
+
femto: Quadrillionth
|
31
|
+
pico: Trillionth
|
32
|
+
nano: Billionth
|
33
|
+
micro: Millionth
|
34
|
+
mili: Thousandth
|
35
|
+
centi: 分
|
36
|
+
deci: 角
|
37
|
+
unit: ""
|
38
|
+
ten:
|
39
|
+
one: 拾
|
40
|
+
other: 拾
|
41
|
+
hundred: 佰
|
42
|
+
thousand: 仟
|
43
|
+
ten_thousand: 万
|
44
|
+
million: 佰万
|
45
|
+
billion: Billion
|
46
|
+
trillion: Trillion
|
47
|
+
quadrillion: Quadrillion
|
48
|
+
support:
|
49
|
+
array:
|
50
|
+
words_connector: ' '
|
51
|
+
two_words_connector: ' '
|
52
|
+
last_word_connector: ' '
|
@@ -0,0 +1,27 @@
|
|
1
|
+
module RailsExtend
|
2
|
+
module Generators
|
3
|
+
class IgnoreGenerator < Rails::Generators::Base
|
4
|
+
source_root File.expand_path('../templates', __FILE__)
|
5
|
+
attr_reader :ignore_models
|
6
|
+
|
7
|
+
def copy_initializer_file
|
8
|
+
puts "#{'*-' * 40}"
|
9
|
+
Models.ignore_models.each do |count, models|
|
10
|
+
puts "#{count.to_s.rjust(2, ' ')}: #{models.inspect}"
|
11
|
+
end
|
12
|
+
puts "#{'*-' * 40}"
|
13
|
+
|
14
|
+
limit = args[0].to_i
|
15
|
+
@ignore_models = Models.ignore_models.select(&->(k, v){ k <= limit })
|
16
|
+
|
17
|
+
template 'initializer.rb', 'config/initializers/rails_extend.rb'
|
18
|
+
end
|
19
|
+
|
20
|
+
def show_readme
|
21
|
+
if behavior == :invoke
|
22
|
+
readme 'README.md'
|
23
|
+
end
|
24
|
+
end
|
25
|
+
end
|
26
|
+
end
|
27
|
+
end
|
@@ -0,0 +1,33 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# bin/rails g rails_com:migrations
|
3
|
+
require 'rails/generators/active_record/migration'
|
4
|
+
|
5
|
+
class RailsExtend::MigrationsGenerator < Rails::Generators::Base
|
6
|
+
include ActiveRecord::Generators::Migration
|
7
|
+
source_root File.expand_path('templates', __dir__)
|
8
|
+
attr_reader :tables
|
9
|
+
|
10
|
+
def create_migration_file
|
11
|
+
file_name = "extend_migration_#{file_index}"
|
12
|
+
|
13
|
+
RailsExtend::Models.db_tables_hash.each do |mig_paths, tables|
|
14
|
+
next if tables.blank?
|
15
|
+
@tables = tables
|
16
|
+
path = Array(mig_paths)[0]
|
17
|
+
migration_template 'migration.rb', File.join(path, "#{file_name}.rb")
|
18
|
+
end
|
19
|
+
end
|
20
|
+
|
21
|
+
def file_index
|
22
|
+
ups = ActiveRecord::Base.connection.migration_context.migrations_status.select do |status, version, name|
|
23
|
+
status == 'up' && name.start_with?('Extend migration ')
|
24
|
+
end
|
25
|
+
if ups.present?
|
26
|
+
index = ups[-1][-1].delete_prefix 'Extend migration '
|
27
|
+
index.to_i + 1
|
28
|
+
else
|
29
|
+
1
|
30
|
+
end
|
31
|
+
end
|
32
|
+
|
33
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# bin/rails g rails_com:rename_module new old
|
3
|
+
require 'rails/generators/active_record/migration'
|
4
|
+
|
5
|
+
class RailsExtend::RemoveTableGenerator < Rails::Generators::Base
|
6
|
+
include ActiveRecord::Generators::Migration
|
7
|
+
source_root File.expand_path('templates', __dir__)
|
8
|
+
attr_reader :tables
|
9
|
+
|
10
|
+
def create_migration_file
|
11
|
+
@tables = RailsExtend::Models.unbound_tables
|
12
|
+
file_name = "extend_remove_table_#{file_index}"
|
13
|
+
|
14
|
+
migration_template 'remove_table.rb', File.join(db_migrate_path, "#{file_name}.rb")
|
15
|
+
end
|
16
|
+
|
17
|
+
def file_index
|
18
|
+
ups = ActiveRecord::Base.connection.migration_context.migrations_status.select do |status, version, name|
|
19
|
+
status == 'up' && name.start_with?('Extend remove table ')
|
20
|
+
end
|
21
|
+
if ups.present?
|
22
|
+
index = ups[-1][-1].delete_prefix 'Extend remove table '
|
23
|
+
index.to_i + 1
|
24
|
+
else
|
25
|
+
1
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,29 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
# bin/rails g rails_com:rename_module new old
|
3
|
+
require 'rails/generators/active_record/migration'
|
4
|
+
|
5
|
+
class RailsExtend::RenameModuleGenerator < Rails::Generators::Base
|
6
|
+
include ActiveRecord::Generators::Migration
|
7
|
+
source_root File.expand_path('templates', __dir__)
|
8
|
+
attr_reader :tables
|
9
|
+
|
10
|
+
def create_migration_file
|
11
|
+
@tables = RailsExtend::Models.migrate_modules_hash.invert
|
12
|
+
file_name = "extend_rename_module_#{file_index}"
|
13
|
+
|
14
|
+
migration_template 'rename_module.rb', File.join(db_migrate_path, "#{file_name}.rb")
|
15
|
+
end
|
16
|
+
|
17
|
+
def file_index
|
18
|
+
ups = ActiveRecord::Base.connection.migration_context.migrations_status.select do |status, version, name|
|
19
|
+
status == 'up' && name.start_with?('Extend rename module ')
|
20
|
+
end
|
21
|
+
if ups.present?
|
22
|
+
index = ups[-1][-1].delete_prefix 'Extend rename module '
|
23
|
+
index.to_i + 1
|
24
|
+
else
|
25
|
+
1
|
26
|
+
end
|
27
|
+
end
|
28
|
+
|
29
|
+
end
|
@@ -0,0 +1,35 @@
|
|
1
|
+
class <%= migration_class_name %> < ActiveRecord::Migration[<%= ActiveRecord::Migration.current_version %>]
|
2
|
+
|
3
|
+
def change
|
4
|
+
<% tables.each do |table_name, attributes| -%>
|
5
|
+
|
6
|
+
<%- if attributes[:table_exists] -%>
|
7
|
+
<%- attributes[:add_references].each do |reference, options| -%>
|
8
|
+
add_belongs_to :<%= table_name %>, :<%= options[:name] %><%= options[:reference_options] %>
|
9
|
+
<%- end -%>
|
10
|
+
<%- attributes[:add_attributes].each do |attribute, options| -%>
|
11
|
+
add_column :<%= table_name %>, :<%= attribute %>, :<%= options[:migrate_type] %><%= options[:attribute_options] %>
|
12
|
+
<%- end -%>
|
13
|
+
<%- attributes[:remove_attributes].each do |attribute, options| -%>
|
14
|
+
remove_column :<%= table_name %>, :<%= attribute %>, :<%= options[:migrate_type] %><%= options[:attribute_options] %>
|
15
|
+
<%- end -%>
|
16
|
+
<%- else -%>
|
17
|
+
create_table :<%= table_name %> do |t|
|
18
|
+
<%- attributes[:add_references].each do |reference, options| -%>
|
19
|
+
t.belongs_to :<%= options[:name] %><%= options[:reference_options] %>
|
20
|
+
<%- end -%>
|
21
|
+
<%- attributes[:add_attributes].each do |attribute, options| -%>
|
22
|
+
t.<%= options[:migrate_type] %> :<%= attribute %><%= options[:attribute_options] %>
|
23
|
+
<%- end -%>
|
24
|
+
<%- if attributes[:timestamps].blank? -%>
|
25
|
+
t.timestamps
|
26
|
+
<%- end -%>
|
27
|
+
<%- attributes[:indexes].each do |index| -%>
|
28
|
+
t.index <%= index[:index].inspect %><%= index[:index_options] %>
|
29
|
+
<%- end -%>
|
30
|
+
end
|
31
|
+
<%- end -%>
|
32
|
+
<%- end -%>
|
33
|
+
end
|
34
|
+
|
35
|
+
end
|
@@ -0,0 +1,26 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RailsExtend::ActiveModel
|
4
|
+
module TypeValue
|
5
|
+
attr_reader :options
|
6
|
+
|
7
|
+
# 让 attribute 方法支持更多选项
|
8
|
+
def initialize(precision: nil, limit: nil, scale: nil, **options)
|
9
|
+
@options = options
|
10
|
+
super(precision: precision, limit: scale, scale: limit)
|
11
|
+
end
|
12
|
+
|
13
|
+
def input_type
|
14
|
+
type
|
15
|
+
end
|
16
|
+
|
17
|
+
def migrate_type
|
18
|
+
return type if type
|
19
|
+
return subtype.type if respond_to?(:subtype) && subtype.type
|
20
|
+
:string
|
21
|
+
end
|
22
|
+
|
23
|
+
end
|
24
|
+
end
|
25
|
+
|
26
|
+
ActiveModel::Type::Value.prepend RailsExtend::ActiveModel::TypeValue
|
@@ -0,0 +1,74 @@
|
|
1
|
+
# frozen_string_literal: true
|
2
|
+
|
3
|
+
module RailsExtend::ActiveRecord
|
4
|
+
module Enum
|
5
|
+
|
6
|
+
def options_i18n(attribute)
|
7
|
+
h = ::I18n.t enum_key(attribute), default: {}
|
8
|
+
h.compact!
|
9
|
+
|
10
|
+
if h.is_a?(Hash) && h.present?
|
11
|
+
return h.invert
|
12
|
+
end
|
13
|
+
|
14
|
+
if h.blank?
|
15
|
+
name = attribute.to_s.pluralize
|
16
|
+
if respond_to?(name)
|
17
|
+
enum_hash = public_send(name)
|
18
|
+
h = enum_hash.keys.map { |i| [i.humanize, i] }.to_h
|
19
|
+
end
|
20
|
+
end
|
21
|
+
|
22
|
+
h
|
23
|
+
end
|
24
|
+
|
25
|
+
def help_i18n(attribute)
|
26
|
+
return nil if attribute.blank?
|
27
|
+
help_key = RailsExtend.config.help_key.call(self, attribute)
|
28
|
+
::I18n.t help_key, default: nil
|
29
|
+
end
|
30
|
+
|
31
|
+
def enum_i18n(attribute, value)
|
32
|
+
h = ::I18n.t enum_key(attribute), default: {}
|
33
|
+
h.compact!
|
34
|
+
|
35
|
+
v = nil
|
36
|
+
if h.is_a?(Hash)
|
37
|
+
v = h[value] ? h[value] : h[value.to_s.to_sym]
|
38
|
+
end
|
39
|
+
|
40
|
+
if v.nil? && value.blank?
|
41
|
+
v = value.to_s
|
42
|
+
end
|
43
|
+
|
44
|
+
if v.nil?
|
45
|
+
v = human_attribute_name(value)
|
46
|
+
end
|
47
|
+
|
48
|
+
v
|
49
|
+
end
|
50
|
+
|
51
|
+
def enum_key(attribute)
|
52
|
+
RailsExtend.config.enum_key.call(self, attribute)
|
53
|
+
end
|
54
|
+
|
55
|
+
def self.extended(mod)
|
56
|
+
mod.attribute_method_suffix '_i18n'
|
57
|
+
|
58
|
+
mod.class_exec do
|
59
|
+
def attribute_i18n(attr)
|
60
|
+
if [:json, :jsonb].include? self.class.columns_hash[attr]&.type
|
61
|
+
send(attr)&.transform_keys! { |key| self.class.human_attribute_name(key) }
|
62
|
+
else
|
63
|
+
self.class.enum_i18n attr, send(attr)
|
64
|
+
end
|
65
|
+
end
|
66
|
+
end
|
67
|
+
end
|
68
|
+
|
69
|
+
end
|
70
|
+
end
|
71
|
+
|
72
|
+
ActiveSupport.on_load :active_record do
|
73
|
+
extend RailsExtend::ActiveRecord::Enum
|
74
|
+
end
|