ruby-on-rails – 活动管理员:如何在嵌套模型的json列上添加sor
如何将jsonb顺序查询传递到Active Admin列的sortable:选项?
我的模型结构如下: # 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 :ranking_score json结构是: # level.ranked_scores {"stage_1"=>111,"stage_2"=>222,"stage_3"=>333} 我试图使用Level的:ranking_scores属性对用户进行排序,如下所示: # 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 生成的用于对列进行排序的URL是 HTTP://本地主机:3000 /管理员为了= levels.ranked_scores [ ‘stage_1’] _desc 但是stage_1的列没有按降序排序. 对于这里出了什么问题的任何想法? 解决方法
您应该在admin / user.rb配置中进行2次微小更改,这将使其可行.
#1你有空格 – >,应该删除它以使ActiveAdmin满意. 这里的问题是由ActiveAdmin的sort validation regexp引起的,它与您的可排序选项不匹配.删除周围的空白区域 – >可以被视为ActiveAdmin的bug的解决方法. #2 Level的表应该作为级别引用,而不是级别. 最后我们有: column "Stage 1 Score",sortable: "levels.ranked_scores->'stage_1'" 你得到了你想要的东西. 关于 – >>的说明操作者 还有另一个Postgres运算符,>>,它与 – >非常相似. See here. 两者之间的区别在于 – >>始终返回文本值(stringified json),而 – >可以返回json对象.在您的示例中,他们的使用完全相同,因为排名分数是数字. 但在一般情况下,您可能需要 – >>操作符也是如此.不幸的是ActiveAdmin还没有解决问题#3173和#3085,这是@bigsolom mentions in his reply.所以你不能使用 – >>运算符与当前版本的ActiveAdmin. 不幸的是,我不能考虑任何解决方法,就像我们做的那样 – >操作符. 还有一个hack你可以使用它来启用这个操作符.它需要在ActiveAdmin的源代码中添加2个字符. 您需要将此line of code更改为以下内容: clause =~ /^([w_.]+)(->>?'w+')?_(desc|asc)$/ 我们添加了>?在两者之间.承诺的2个字符. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |