gpt4 book ai didi

ruby-on-rails - 多个关联的 Ransacker 谓词

转载 作者:行者123 更新时间:2023-12-03 20:20:57 25 4
gpt4 key购买 nike

我有一个案例,我有一个名为 Event 的模型,它:
* has_one primary_day
* has_one backup_day
* has_one Emergency_day

在每个 has_one 关联中,都有一组相同的 bool 字段,例如
批准的法律、批准的故障、批准的费用等

在我的搜索表单中 - 我不想为这些相同的字段单独搜索每个关联。

例如我不想这样做:

<%= f.check_box :primary_day_approved_legal_true %>

对于每个字段,因为它太冗长了,我想这样做:
<%= f.check_box :approved_legal_true %> 

这将整理所有关联并返回所有 has_one 关联中已批准_合法的事件。

我尝试了几种不同的方法来解决这个问题,但我无法让它工作,所以我认为我想要做的事情目前是不可能的。您能否证实我的理论,或者让我知道如果确实可能的话,它是如何实现的?

作为引用,我尝试了以下方法:

1. Event模型中的自定义ransacker

由于我很乐意使用现有的 true 谓词,因此我认为只需添加一个返回我想要的内容的 ransacker 就可以了。但似乎不是,例如
ransacker :created_at do |parent|
Arel.sql('select * from events inner join on primary_days .......')
end

这个掠夺者似乎总是从它被添加到的模型上的一个选择开始。所以我不能使用连接到协会。似乎ransacker 必须在它相关的模型上返回一个现有的数据库列。因此,出于同样的原因,我无法想出可以使这种方法起作用的 Arel 代码。尽管尝试创建一个 Arel 表来表示关联,然后尝试在 arel 中进行连接 - 但结果总是相同 - 在 ArelSelectManager 上没有这样的方法 eq。

例如
ransacker :created_at do |parent|
primary_days = Arel::Table.new(:primary_days)
events = parent.table
events.join(primary_days).on(events[:id].eq(primary_days[:event_id]))
end

2. 使用命名作用域和问题 61 中找到的作用域的补丁 - https://gist.github.com/RohanM/5350768

我将代码放在 initializers/ransack.rb 中,然后:

模型:
scope_ransackable :approved_legal
scope :approved_legal_scope, -> {
Event.joins(:primary_day).where(:primary_days: {approved_legal: true})
}

Controller
Event.search_with_scopes(params[q])

看法
<%= f.check_box(:approved_legal_scope)%>

但这只是导致了一个错误,指出在 Ransack 搜索对象上没有找到 Approved_legal_scope 方法

任何指向正确方向的指针都将不胜感激。谢谢。

最佳答案

我已经设法通过使用 Rails 5 之前的 hack 链接作用域来实现这一点。

scope :short_search_scope, ->(search) {
joins(:something)
.where(
unscoped.one_scope(search)
.another_scope(search)
.where_values.join(' OR '))
}

scope :one_scope, -> (search) {
where(approved_legal: true)
}

...

def self.ransackable_scopes(auth_object = nil)
[:short_search_scope]
end
where_values.join(' OR ')可以换成 where().or.where()当这个特性在 Rails 5 中发布时。

关于ruby-on-rails - 多个关联的 Ransacker 谓词,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24034660/

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