gpt4 book ai didi

sql - Rails,洗劫 : How to search HABTM relationship for "all" matches instead of "any"

转载 作者:行者123 更新时间:2023-12-04 12:48:33 25 4
gpt4 key购买 nike

我想知道是否有人有使用 Ransack 与 HABTM 关系的经验。我的应用有 photosterms 有 habtm 关系(术语就像标签)。这是我所经历的简化解释:

我有两张照片:照片 1 和照片 2。它们有以下术语:

图一:A、B、C

图二:A、B、D

我构建了一个搜索表单,并在搜索表单中为所有术语创建了复选框,如下所示:

- terms.each do |t|
= check_box_tag 'q[terms_id_in][]', t.id

如果我使用: q[terms_id_in][]我检查“A,C”我的结果是照片 1 和照片 2。我只想要照片 1,因为我要求 A 和 C,在这个查询中我不关心 B 或 D 但我想要 A 和 C出现在给定的结果上。

如果我使用 q[terms_id_in_all][]我的结果是零,因为两张照片都只包含 A 和 C。或者,也许因为每个连接只有一个术语,所以没有连接匹配 A 和 C。无论如何,我只想返回照片 1。

如果我使用任何种类的 q[terms_id_eq][]我从来没有得到任何结果,所以我认为这在这种情况下不起作用。

那么,给定一个 habtm 连接,你如何搜索匹配给定值的模型而忽略未给定的值?

或者,对于任何不熟悉 Ransack 的 rails/sql 专家,您还能如何创建一个搜索表单,就像我为具有 habtm 连接的模型所描述的那样?

更新:每 the answer to related question ,我现在已经构建了一个正确匹配的 Arel 查询。不知何故,你应该能够将 Arel 节点用作掠夺者,或者正如 cdesrosiers 指出的那样,作为自定义谓词,但到目前为止我还没有做到这一点。

根据那个答案,我设置了以下 ransack 初始值设定项:
Ransack.configure do |config|
config.add_predicate 'has_terms',
:arel_predicate => 'in',
:formatter => proc {|term_ids| Photo.terms_subquery(term_ids)},
:validator => proc {|v| v.present?},
:compounds => true
end

...然后在照片上设置以下方法:
def self.terms_subquery(term_ids)
photos = Arel::Table.new(:photos)
terms = Arel::Table.new(:terms)
photos_terms = Arel::Table.new(:photos_terms)
photos[:id].in(
photos.project(photos[:id])
.join(photos_terms).on(photos[:id].eq(photos_terms[:photo_id]))
.join(terms).on(photos_terms[:term_id].eq(terms[:id]))
.where(terms[:id].in(term_ids))
.group(photos.columns)
.having(terms[:id].count.eq(term_ids.length))
).to_sql
end

不幸的是,这似乎不起作用。虽然 terms_subquery产生正确的SQL,结果 Photo.search(:has_terms => [2,5]).result.to_sql只是 "SELECT \"photos\".* FROM \"photos\" "

最佳答案

使用我的 answer 中定义的自定义 ransack 谓词对于您的相关问题,这应该对您的标记进行简单的更改:

- terms.each do |t|
= check_box_tag 'q[id_has_terms][]', t.id

更新
:formatter没有按照我的想法行事,并且看到 Ransack 存储库如何没有提到“子查询”,毕竟您可能无法将其用于您想要做的事情。所有可用的选项似乎都用完了,所以除了猴子补丁之外别无他法。

为什么不像通常使用事件记录(或什至使用您现在拥有的 Arel 查询)那样跳过搜查并查询“照片”表?您已经知道查询有效。您是否希望从使用 Ransack 中获得特定的好处?

关于sql - Rails,洗劫 : How to search HABTM relationship for "all" matches instead of "any",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13409627/

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