Conversation
bce2c0f to
44de75b
Compare
|
@pablobm |
| def with_tiebreak(relation, ordered_column: nil) | ||
| tiebreak_key = relation.primary_key | ||
| tiebreak_order = tiebreak_order_for(relation) | ||
|
|
||
| if tiebreak_order && ordered_column.to_s != tiebreak_key.to_s | ||
| relation.order(tiebreak_order) | ||
| else | ||
| relation | ||
| end | ||
| end | ||
|
|
||
| def tiebreak_order_for(relation) | ||
| tiebreak_key = relation.primary_key | ||
|
|
||
| if tiebreak_key && column_exist?(relation, tiebreak_key) | ||
| relation.arel_table[tiebreak_key].public_send(direction) | ||
| end | ||
| end |
There was a problem hiding this comment.
Having to do tiebreak_key = relation.primary_key twice smells a bit wrong to me. I wonder if we can do this differently, perhaps making these functions a bit more generic and less tied to the concept of tiebreak. Perhaps even usable elsewhere in the class... For now, would this make sense?
| def with_tiebreak(relation, ordered_column: nil) | |
| tiebreak_key = relation.primary_key | |
| tiebreak_order = tiebreak_order_for(relation) | |
| if tiebreak_order && ordered_column.to_s != tiebreak_key.to_s | |
| relation.order(tiebreak_order) | |
| else | |
| relation | |
| end | |
| end | |
| def tiebreak_order_for(relation) | |
| tiebreak_key = relation.primary_key | |
| if tiebreak_key && column_exist?(relation, tiebreak_key) | |
| relation.arel_table[tiebreak_key].public_send(direction) | |
| end | |
| end | |
| def with_tiebreak(relation, ordered_column: nil) | |
| tiebreak_key = relation.primary_key | |
| if ordered_column.to_s != tiebreak_key.to_s | |
| sort_by(relation, tiebreak_key) | |
| else | |
| relation | |
| end | |
| end | |
| def sort_by(relation, column) | |
| if column && column_exist?(relation, column) | |
| order = relation.arel_table[column].public_send(direction) | |
| relation.order(order) | |
| else | |
| relation | |
| end | |
| end |
This breaks some examples in spec/lib/administrate/order_spec.rb, but they are testing the private method which is also a bad smell anyway.
|
Thanks for the suggestion! One thing I like about keeping I extracted |
Previously, tiebreaking by primary key was introduced for direct column ordering.
However, association-based orderings (
has_many,belongs_to,has_one) did not benefit from the same behavior.This PR extends tiebreaking to all association orderings by extracting the logic into a shared
with_tiebreakhelper. Each association ordering method now passes its result throughwith_tiebreak, which appends anORDER BY primary_keyclause when applicable.No tiebreak is added when the parent relation has no primary key.