How do I pass in a jsonb order query into the sortable:
option for an Active Admin column?
My model is structured like this:
# User Model
class User < ActiveRecord::Base
has_one :level
end
# Level Model
class Level < ActiveRecord::Base
belongs_to :user
end
# Level Migration
create_table "levels", force: :cascade do |t|
t.integer "user_id"
t.jsonb "ranked_scores"
end
The :ranked_score
json structure is:
# level.ranked_scores
{"stage_1"=>111, "stage_2"=>222, "stage_3"=>333}
I have tried to sort the User
using a Level
's :ranked_scores
attribute as follows:
# app/admin/user.rb
ActiveAdmin.register User do
controller do
def scoped_collection
end_of_association_chain.includes(:level)
end
end
index do
column "Stage 1 Score", sortable: "level.ranked_scores -> 'stage_1'" do |user|
user.level.ranked_scores['stage_1']
end
end
end
ActiveAdmin.register Level do
belongs_to :user
end
The url generated to sort the colums is
http://localhost:3000/admin?order=levels.ranked_scores%5B%27stage_1%27%5D_desc
but the columns are not sorted in descending order for stage_1
.
Any ideas for what is going wrong here?
You should make 2 minor changes in admin/user.rb
configuration which will make it workable.
#1 You have spaces around ->
, which should be removed to make ActiveAdmin happy.
The problem here is caused by ActiveAdmin's sort validation regexp, which doesn't match your sortable option. Removing white spaces around ->
can be considered as a workaround for ActiveAdmin's bug.
#2 Level
's table should be referenced as levels
, not level
.
So finally we have:
column "Stage 1 Score", sortable: "levels.ranked_scores->'stage_1'"
And you get what you intended to have.
->>
operatorThere is another Postgres operator, ->>
, which is very similar to the ->
. See here.
The difference between the two is, that ->>
always returns text value (stringified json), while ->
can return json object. In your example their use is absolutely identical, because ranked scores are numbers.
But in general case, you might need ->>
operator as well. Unfortunately ActiveAdmin still haven't fixed issues #3173 and #3085, which @bigsolom mentions in his reply. So you can't use ->>
operator with current version of ActiveAdmin.
Unfortunately I can't think about any workaround, like we did with ->
operator.
Still there is a hack you can use to enable this operator as well. It requires adding 2 characters into the source code of ActiveAdmin.
You need to change this line of code to the following one:
clause =~ /^([\w\_\.]+)(->>?'\w+')?_(desc|asc)$/
we added >?
in-between. 2 chars, as promised.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With