Skip to content

Commit d1e3334

Browse files
authored
Support Composite Primary Keys gem (#3527)
1 parent 652418c commit d1e3334

40 files changed

Lines changed: 643 additions & 23 deletions

.github/workflows/test.yml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,11 @@ jobs:
3939
orm: active_record
4040
adapter: postgresql
4141
asset: sprockets
42+
- ruby: "3.0"
43+
gemfile: gemfiles/composite_primary_keys.gemfile
44+
orm: active_record
45+
adapter: sqlite3
46+
asset: sprockets
4247
- ruby: 2.7
4348
gemfile: gemfiles/rails_6.0.gemfile
4449
orm: mongoid

Appraisals

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,3 +85,21 @@ appraise 'rails-7.0' do
8585
gem 'paper_trail', '>= 12.0'
8686
end
8787
end
88+
89+
appraise 'composite_primary_keys' do
90+
gem 'rails', '~> 7.0.0'
91+
gem 'sassc-rails', '~> 2.1'
92+
gem 'devise', '~> 4.8'
93+
94+
group :test do
95+
gem 'cancancan', '~> 3.2'
96+
gem 'kt-paperclip'
97+
gem 'rspec-rails', '>= 4.0.0.beta2'
98+
gem 'shrine', '~> 3.0'
99+
end
100+
101+
group :active_record do
102+
gem 'composite_primary_keys'
103+
gem 'paper_trail', '>= 12.0'
104+
end
105+
end

app/controllers/rails_admin/main_controller.rb

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -60,14 +60,13 @@ def back_or_index
6060
end
6161

6262
def get_sort_hash(model_config)
63-
abstract_model = model_config.abstract_model
6463
field = model_config.list.fields.detect { |f| f.name.to_s == params[:sort] }
6564
# If no sort param, default to the `sort_by` specified in the list config
66-
field ||= model_config.list.possible_fields.detect { |f| f.name == model_config.list.sort_by.to_sym }
65+
field ||= model_config.list.possible_fields.detect { |f| f.name == model_config.list.sort_by.try(:to_sym) }
6766

6867
column =
6968
if field.nil? || field.sortable == false # use default sort, asked field does not exist or is not sortable
70-
"#{abstract_model.table_name}.#{model_config.list.sort_by}"
69+
model_config.list.sort_by
7170
else
7271
field.sort_column
7372
end

app/helpers/rails_admin/form_builder.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -107,6 +107,14 @@ def dom_name(field)
107107
(@dom_name ||= {})[field.name] ||= %(#{@object_name}#{options[:index] && "[#{options[:index]}]"}[#{field.method_name}]#{field.is_a?(Config::Fields::Association) && field.multiple? ? '[]' : ''})
108108
end
109109

110+
def hidden_field(method, options = {})
111+
if method == :id
112+
super method, {value: object.id.to_s}
113+
else
114+
super
115+
end
116+
end
117+
110118
protected
111119

112120
def generator_action(action, nested)

app/views/rails_admin/main/_form_filtering_multiselect.html.erb

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
source_abstract_model = RailsAdmin.config(form.object.class).abstract_model
44

55
selected = form.object.send(field.name)
6-
selected_ids = selected.map{|s| s.send(field.associated_primary_key)}
6+
selected_ids = selected.map{|s| s.send(field.associated_primary_key).to_s}
77

88
current_action = params[:action].in?(['create', 'new']) ? 'create' : 'update'
99

@@ -13,7 +13,7 @@
1313
selected.map { |o| [o.send(field.associated_object_label_method), o.send(field.associated_primary_key)] }
1414
else
1515
i = 0
16-
controller.list_entries(config, :index, field.associated_collection_scope, false).map { |o| [o.send(field.associated_object_label_method), o.send(field.associated_primary_key)] }.sort_by {|a| [selected_ids.index(a[1]) || selected_ids.size, i+=1] }
16+
controller.list_entries(config, :index, field.associated_collection_scope, false).map { |o| [o.send(field.associated_object_label_method), o.send(field.associated_primary_key).to_s] }.sort_by {|a| [selected_ids.index(a[1]) || selected_ids.size, i+=1] }
1717
end
1818

1919
js_data = {

app/views/rails_admin/main/_form_filtering_select.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88

99
xhr = !field.associated_collection_cache_all
1010

11-
collection = xhr ? [[field.formatted_value, field.selected_id]] : controller.list_entries(config, :index, field.associated_collection_scope, false).map { |o| [o.send(field.associated_object_label_method), o.send(field.associated_primary_key)] }
11+
collection = xhr ? [[field.formatted_value, field.selected_id]] : controller.list_entries(config, :index, field.associated_collection_scope, false).map { |o| [o.send(field.associated_object_label_method), o.send(field.associated_primary_key).to_s] }
1212

1313
js_data = {
1414
xhr: xhr,

app/views/rails_admin/main/index.html.erb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -140,7 +140,7 @@
140140
<tr class="<%= @abstract_model.param_key %>_row <%= @model_config.list.with(object: object).row_css_class %>">
141141
<% if checkboxes %>
142142
<td class="sticky">
143-
<%= check_box_tag "bulk_ids[]", object.id, false %>
143+
<%= check_box_tag "bulk_ids[]", object.id.to_s, false %>
144144
</td>
145145
<% end %>
146146
<% properties.map{ |property| property.bind(:object, object) }.each do |property| %>

config/initializers/active_record_extensions.rb

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -22,4 +22,27 @@ def safe_send(value)
2222
end
2323
end
2424
end
25+
26+
if defined?(CompositePrimaryKeys)
27+
# Apply patch until the fix is released:
28+
# https://github.com/composite-primary-keys/composite_primary_keys/pull/572
29+
CompositePrimaryKeys::CompositeKeys.class_eval do
30+
alias_method :to_param, :to_s
31+
end
32+
33+
CompositePrimaryKeys::CollectionAssociation.prepend(Module.new do
34+
def ids_writer(ids)
35+
if reflection.association_primary_key.is_a? Array
36+
ids = CompositePrimaryKeys.normalize(Array(ids).reject(&:blank?), reflection.association_primary_key.size)
37+
reflection.association_primary_key.each_with_index do |primary_key, i|
38+
pk_type = klass.type_for_attribute(primary_key)
39+
ids.each do |id|
40+
id[i] = pk_type.cast(id[i]) if id.is_a? Array
41+
end
42+
end
43+
end
44+
super ids
45+
end
46+
end)
47+
end
2548
end
Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,52 @@
1+
# This file was generated by Appraisal
2+
3+
source "https://rubygems.org"
4+
5+
gem "appraisal", ">= 2.0"
6+
gem "devise", "~> 4.8"
7+
gem "rails", "~> 7.0.0"
8+
gem "webpacker", require: false
9+
gem "webrick", "~> 1.7"
10+
gem "sassc-rails", "~> 2.1"
11+
12+
group :active_record do
13+
gem "paper_trail", ">= 12.0"
14+
gem "composite_primary_keys"
15+
16+
platforms :ruby, :mswin, :mingw, :x64_mingw do
17+
gem "mysql2", ">= 0.3.14"
18+
gem "sqlite3", ">= 1.3"
19+
end
20+
end
21+
22+
group :development, :test do
23+
gem "pry", ">= 0.9"
24+
end
25+
26+
group :test do
27+
gem "cancancan", "~> 3.2"
28+
gem "carrierwave", [">= 2.0.0.rc", "< 3"]
29+
gem "cuprite"
30+
gem "database_cleaner-active_record", ">= 2.0", require: false
31+
gem "database_cleaner-mongoid", ">= 2.0", require: false
32+
gem "dragonfly", "~> 1.0"
33+
gem "factory_bot", ">= 4.2"
34+
gem "generator_spec", ">= 0.8"
35+
gem "launchy", ">= 2.2"
36+
gem "mini_magick", ">= 3.4"
37+
gem "pundit"
38+
gem "rack-cache", require: "rack/cache"
39+
gem "rspec-expectations", "!= 3.8.3"
40+
gem "rspec-rails", ">= 4.0.0.beta2"
41+
gem "rspec-retry"
42+
gem "rubocop", ["~> 1.20", "!= 1.22.2"], require: false
43+
gem "rubocop-performance", require: false
44+
gem "simplecov", ">= 0.9", require: false
45+
gem "simplecov-lcov", require: false
46+
gem "timecop", ">= 0.5"
47+
gem "tzinfo-data", platforms: [:mingw, :mswin, :x64_mingw, :jruby]
48+
gem "kt-paperclip"
49+
gem "shrine", "~> 3.0"
50+
end
51+
52+
gemspec path: "../"

lib/rails_admin/abstract_model.rb

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -101,8 +101,13 @@ def each_associated_children(object)
101101

102102
def initialize_active_record
103103
@adapter = :active_record
104-
require 'rails_admin/adapters/active_record'
105-
extend Adapters::ActiveRecord
104+
if defined?(::CompositePrimaryKeys)
105+
require 'rails_admin/adapters/composite_primary_keys'
106+
extend Adapters::CompositePrimaryKeys
107+
else
108+
require 'rails_admin/adapters/active_record'
109+
extend Adapters::ActiveRecord
110+
end
106111
end
107112

108113
def initialize_mongoid

0 commit comments

Comments
 (0)