加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

ruby-on-rails – 活动管理员:如何在嵌套模型的json列上添加sor

发布时间:2020-12-16 21:05:24 所属栏目:百科 来源:网络整理
导读:如何将jsonb顺序查询传递到Active Admin列的sortable:选项? 我的模型结构如下: # User Modelclass User ActiveRecord::Base has_one :levelend# Level Modelclass Level ActiveRecord::Base belongs_to :user end# Level Migrationcreate_table "levels",
如何将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个字符.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读