Skip to content

Commit 0e92ca4

Browse files
committed
Fix be7d2f4 broke belongs_to with custom primary key
Fixes #3184
1 parent 6d20ee7 commit 0e92ca4

File tree

8 files changed

+104
-18
lines changed

8 files changed

+104
-18
lines changed

lib/rails_admin/adapters/mongoid/association.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ def klass
4141
end
4242

4343
def primary_key
44-
:_id
44+
association.primary_key.to_sym rescue :_id
4545
end
4646

4747
def foreign_key

lib/rails_admin/config/actions/index.rb

+1-1
Original file line numberDiff line numberDiff line change
@@ -49,7 +49,7 @@ class Index < RailsAdmin::Config::Actions::Base
4949
format.json do
5050
output = begin
5151
if params[:compact]
52-
primary_key_method = @model_config.abstract_model.primary_key
52+
primary_key_method = @association ? @association.associated_primary_key : @model_config.abstract_model.primary_key
5353
label_method = @model_config.object_label_method
5454
@objects.collect { |o| {id: o.send(primary_key_method).to_s, label: o.send(label_method).to_s} }
5555
else

lib/rails_admin/config/fields/types/belongs_to_association.rb

+4
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,10 @@ class BelongsToAssociation < RailsAdmin::Config::Fields::Association
3535
true
3636
end
3737

38+
def associated_primary_key
39+
@associated_primary_key ||= association.primary_key
40+
end
41+
3842
def selected_id
3943
bindings[:object].send(foreign_key)
4044
end
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
class ManagingUser < User
2+
has_one :team, class_name: 'ManagedTeam', foreign_key: :manager, primary_key: :email, inverse_of: :user
23
has_many :teams, class_name: 'ManagedTeam', foreign_key: :manager, primary_key: :email, inverse_of: :user
4+
5+
def team_id=(id)
6+
self.team = ManagedTeam.find_by_id(id)
7+
end
38
end
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,8 @@
11
class ManagingUser < User
2+
has_one :team, class_name: 'ManagedTeam', foreign_key: :manager, primary_key: :email, inverse_of: :user
23
has_many :teams, class_name: 'ManagedTeam', foreign_key: :manager, primary_key: :email, inverse_of: :user
4+
5+
def team_id=(id)
6+
self.team = ManagedTeam.where(_id: id).first
7+
end
38
end

spec/integration/fields/belongs_to_association_spec.rb

+29-5
Original file line numberDiff line numberDiff line change
@@ -42,18 +42,42 @@
4242
end
4343

4444
context 'with custom primary_key option' do
45-
let(:user) { FactoryBot.create :managing_user }
46-
let!(:teams) { [FactoryBot.create(:managed_team, manager: user.email), FactoryBot.create(:managed_team)] }
45+
let(:users) { FactoryBot.create_list :managing_user, 2 }
46+
let!(:teams) { [FactoryBot.create(:managed_team, manager: users[0].email), FactoryBot.create(:managed_team)] }
4747
before do
48-
RailsAdmin.config.included_models = [ManagedTeam]
48+
RailsAdmin.config.included_models = [ManagedTeam, ManagingUser]
4949
RailsAdmin.config ManagedTeam do
5050
field :user
5151
end
5252
end
5353

54-
it 'picks up associated primary key correctly' do
54+
it 'allows update' do
5555
visit edit_path(model_name: 'managed_team', id: teams[0].id)
56-
expect(page).to have_css("select#managed_team_manager option[value=\"#{user.id}\"]")
56+
expect(page).to have_css("select#managed_team_manager option[value=\"#{users[0].email}\"]")
57+
select("ManagingUser ##{users[1].id}", from: 'User')
58+
click_button 'Save'
59+
teams[0].reload
60+
expect(teams[0].user).to eq users[1]
61+
end
62+
63+
context 'when fetching associated objects via xhr' do
64+
before do
65+
RailsAdmin.config ManagedTeam do
66+
field(:user) { associated_collection_cache_all false }
67+
end
68+
end
69+
70+
it 'allows update', js: true do
71+
visit edit_path(model_name: 'managed_team', id: teams[0].id)
72+
find('input.ra-filtering-select-input').set('M')
73+
page.execute_script("$('input.ra-filtering-select-input').trigger('focus')")
74+
page.execute_script("$('input.ra-filtering-select-input').trigger('keydown')")
75+
expect(page).to have_selector('ul.ui-autocomplete li.ui-menu-item a')
76+
page.execute_script %{$('ul.ui-autocomplete li.ui-menu-item a:contains("ManagingUser ##{users[1].id}")').trigger('mouseenter').click()}
77+
click_button 'Save'
78+
teams[0].reload
79+
expect(teams[0].user).to eq users[1]
80+
end
5781
end
5882
end
5983
end

spec/integration/fields/has_many_association_spec.rb

+22-11
Original file line numberDiff line numberDiff line change
@@ -255,24 +255,35 @@
255255
before do
256256
RailsAdmin.config.included_models = [ManagingUser, ManagedTeam]
257257
RailsAdmin.config ManagingUser do
258-
field(:teams) { associated_collection_cache_all false }
258+
field :teams
259259
end
260260
end
261261

262-
it "picks up associated model's primary key correctly" do
262+
it "allows update" do
263263
visit edit_path(model_name: 'managing_user', id: user.id)
264264
expect(find("select#managing_user_team_ids option[value=\"#{teams[0].id}\"]")).to have_content teams[0].name
265-
end
266-
267-
it "allows update with fetching associated objects via xhr", js: true do
268-
visit edit_path(model_name: 'managing_user', id: user.id)
269-
find('input.ra-multiselect-search').set('T')
270-
page.execute_script("$('input.ra-multiselect-search').trigger('focus')")
271-
page.execute_script("$('input.ra-multiselect-search').trigger('keydown')")
272-
find('.ra-multiselect-collection option', text: teams[1].name).select_option
273-
find('.ra-multiselect-item-add').click
265+
select(teams[1].name, from: 'Teams')
274266
click_button 'Save'
275267
expect(ManagingUser.first.teams).to match_array teams
276268
end
269+
270+
context 'when fetching associated objects via xhr' do
271+
before do
272+
RailsAdmin.config ManagingUser do
273+
field(:teams) { associated_collection_cache_all false }
274+
end
275+
end
276+
277+
it "allows update", js: true do
278+
visit edit_path(model_name: 'managing_user', id: user.id)
279+
find('input.ra-multiselect-search').set('T')
280+
page.execute_script("$('input.ra-multiselect-search').trigger('focus')")
281+
page.execute_script("$('input.ra-multiselect-search').trigger('keydown')")
282+
find('.ra-multiselect-collection option', text: teams[1].name).select_option
283+
find('.ra-multiselect-item-add').click
284+
click_button 'Save'
285+
expect(ManagingUser.first.teams).to match_array teams
286+
end
287+
end
277288
end
278289
end

spec/integration/fields/has_one_assosiation_spec.rb

+37
Original file line numberDiff line numberDiff line change
@@ -92,4 +92,41 @@
9292
expect(@record.comment).to be_nil
9393
end
9494
end
95+
96+
context 'with custom primary_key option' do
97+
let(:user) { FactoryBot.create :managing_user }
98+
let!(:team) { FactoryBot.create(:managed_team) }
99+
before do
100+
RailsAdmin.config.included_models = [ManagingUser, ManagedTeam]
101+
RailsAdmin.config ManagingUser do
102+
field :team
103+
end
104+
end
105+
106+
it "allows update" do
107+
visit edit_path(model_name: 'managing_user', id: user.id)
108+
select(team.name, from: 'Team')
109+
click_button 'Save'
110+
expect(ManagingUser.first.team).to eq team
111+
end
112+
113+
context 'when fetching associated objects via xhr' do
114+
before do
115+
RailsAdmin.config ManagingUser do
116+
field(:team) { associated_collection_cache_all false }
117+
end
118+
end
119+
120+
it "allows update", js: true do
121+
visit edit_path(model_name: 'managing_user', id: user.id)
122+
find('input.ra-filtering-select-input').set('T')
123+
page.execute_script("$('input.ra-filtering-select-input').trigger('focus')")
124+
page.execute_script("$('input.ra-filtering-select-input').trigger('keydown')")
125+
expect(page).to have_selector('ul.ui-autocomplete li.ui-menu-item a')
126+
page.execute_script %{$('ul.ui-autocomplete li.ui-menu-item a:contains("#{team.name}")').trigger('mouseenter').click()}
127+
click_button 'Save'
128+
expect(ManagingUser.first.team).to eq team
129+
end
130+
end
131+
end
95132
end

0 commit comments

Comments
 (0)