Skip to content

Commit ece5f0e

Browse files
committed
fix: support composite primary keys in resource getters
1 parent 46e5b46 commit ece5f0e

File tree

2 files changed

+26
-3
lines changed

2 files changed

+26
-3
lines changed

app/services/forest_liana/has_many_getter.rb

Lines changed: 25 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,29 @@ def perform
2525
end
2626

2727
def count
28-
@records_count = @records.count
28+
association_class = model_association
29+
30+
if association_class.primary_key.is_a?(Array)
31+
adapter_name = association_class.connection.adapter_name.downcase
32+
33+
if adapter_name.include?('sqlite')
34+
# For SQLite: concatenate columns for DISTINCT count
35+
pk_concat = association_class.primary_key.map do |pk|
36+
"#{association_class.table_name}.#{pk}"
37+
end.join(" || '|' || ")
38+
39+
@records_count = @records.distinct.count(Arel.sql(pk_concat))
40+
else
41+
# For PostgreSQL/MySQL: use DISTINCT with multiple columns
42+
pk_columns = association_class.primary_key.map do |pk|
43+
"#{association_class.table_name}.#{pk}"
44+
end.join(', ')
45+
46+
@records_count = @records.distinct.count(Arel.sql(pk_columns))
47+
end
48+
else
49+
@records_count = @records.count
50+
end
2951
end
3052

3153
def query_for_batch
@@ -72,7 +94,8 @@ def model_association
7294
end
7395

7496
def prepare_query
75-
association = get_resource().find(@params[:id]).send(@params[:association_name])
97+
parent_record = ForestLiana::Utils::CompositePrimaryKeyHelper.find_record(get_resource(), @resource, @params[:id])
98+
association = parent_record.send(@params[:association_name])
7699
@records = optimize_record_loading(association, @search_query_builder.perform(association))
77100
end
78101

app/services/forest_liana/resource_getter.rb

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ def initialize(resource, params, forest_user)
1414
def perform
1515
records = optimize_record_loading(@resource, get_resource())
1616
scoped_records = ForestLiana::ScopeManager.apply_scopes_on_records(records, @user, @collection_name, @params[:timezone])
17-
@record = scoped_records.find(@params[:id])
17+
@record = ForestLiana::Utils::CompositePrimaryKeyHelper.find_record(scoped_records, @resource, @params[:id])
1818
end
1919
end
2020
end

0 commit comments

Comments
 (0)