22-6ren">
gpt4 book ai didi

ruby-on-rails - 事件管理员 : how to add sortable on nested model's json column

转载 作者:行者123 更新时间:2023-11-29 11:25:11 25 4
gpt4 key购买 nike

如何将 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

:ranked_score json 结构是:

# level.ranked_scores
{"stage_1"=>111, "stage_2"=>222, "stage_3"=>333}

我尝试使用 Level:ranked_scores 属性对 User 进行排序,如下所示:

# 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://localhost:3000/admin?order=levels.ranked_scores%5B%27stage_1%27%5D_desc

但是 stage_1 的列未按降序排序。

对这里出了什么问题有什么想法吗?

最佳答案

您应该在 admin/user.rb 配置中做 2 处小改动,使其可以正常工作。

#1 -> 周围有空格,应将其删除以使 ActiveAdmin 满意。

这里的问题是由ActiveAdmin的sort validation regexp引起的,这与您的可排序选项不匹配。删除 -> 周围的空格可以被视为 ActiveAdmin 错误的解决方法。

#2 Level 的表应该被引用为 levels,而不是 level

最后我们有:

column "Stage 1 Score", sortable: "levels.ranked_scores->'stage_1'"

你得到了你想要的。

关于 ->> 运算符的注意事项

还有另一个 Postgres 运算符,->>,它与 -> 非常相似。 See here .

两者的区别在于,->>总是返回文本值(字符串化json),而->可以返回json对象。在您的示例中,它们的用法完全相同,因为排名分数是数字。

但在一般情况下,您可能还需要 ->> 运算符。不幸的是,ActiveAdmin 仍未解决问题 #3173 和 #3085,即 @bigsolom mentions in his reply .所以您不能在当前版本的 ActiveAdmin 中使用 ->> 运算符。

不幸的是,我想不出任何解决方法,就像我们对 -> 运算符所做的那样。

您还可以使用 hack 来启用此运算符。需要在ActiveAdmin的源代码中加入2个字符。

您需要更改此 line of code到以下一个:

clause =~ /^([\w\_\.]+)(->>?'\w+')?_(desc|asc)$/

我们在中间添加了 >?。 2 个字符,如所 promise 的那样。

关于ruby-on-rails - 事件管理员 : how to add sortable on nested model's json column,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32026203/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com