diff --git a/lib/administrate/order.rb b/lib/administrate/order.rb index 4f32da6cd2..25f9d19602 100644 --- a/lib/administrate/order.rb +++ b/lib/administrate/order.rb @@ -62,7 +62,7 @@ def order_by_count(relation) end def order_by_id(relation) - relation.reorder("#{attribute}_id #{direction}") + relation.reorder("#{foreign_key(relation)} #{direction}") end def has_many_attribute?(relation) @@ -76,5 +76,9 @@ def belongs_to_attribute?(relation) def reflect_association(relation) relation.klass.reflect_on_association(attribute.to_s) end + + def foreign_key(relation) + reflect_association(relation).foreign_key + end end end diff --git a/spec/lib/administrate/order_spec.rb b/spec/lib/administrate/order_spec.rb index 33bc27aeff..1522e23787 100644 --- a/spec/lib/administrate/order_spec.rb +++ b/spec/lib/administrate/order_spec.rb @@ -73,12 +73,15 @@ context "when relation has belongs_to association" do it "orders by id" do order = Administrate::Order.new(:name) - relation = relation_with_association(:belongs_to) + relation = relation_with_association( + :belongs_to, + foreign_key: "some_foreign_key", + ) allow(relation).to receive(:reorder).and_return(relation) ordered = order.apply(relation) - expect(relation).to have_received(:reorder).with("name_id asc") + expect(relation).to have_received(:reorder).with("some_foreign_key asc") expect(ordered).to eq(relation) end end @@ -176,9 +179,15 @@ def relation_with_column(column) ) end - def relation_with_association(association) + def relation_with_association(association, foreign_key: "#{association}_id") double( - klass: double(reflect_on_association: double(macro: association)), + klass: double( + reflect_on_association: double( + "#{association}_reflection", + macro: association, + foreign_key: foreign_key, + ), + ), ) end end