当前位置: 首页 > 面试题库 >

Rails,Ransack:如何在HABTM关系中搜索“匹配”而不是“ ny”。

皇甫敏达
2023-03-14
问题内容

我想知道是否有人有使用Ransack与HABTM关系的经验。我的应用具有photos与之的habtm关系terms(术语类似于标签)。这是我正在经历的简化解释:

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

照片1:A,B,C

照片2:A,B,D

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

- 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][]结果为nil,则因为两张照片都没有只包含A和C。或者也许是因为每个联接只包含一个术语,所以没有联接同时匹配A和C。无论如何,我只希望返回照片1。

如果我使用各种方法q[terms_id_eq][]我永远都不会得到任何结果,因此在这种情况下,我认为这种方法无效。

因此,给定一个habtm联接,如何在不考虑给定值的情况下搜索与给定值匹配的模型?

或者,对于不熟悉Ransack的所有Rails / sql专家,您还可以如何创建一个搜索表单,例如我正在为具有habtm连接的模型描述的那样?

更新:根据相关问题的答案我现在已经构建了一个与之正确匹配的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\" "


问题答案:

在我对您的相关问题的回答中定义了一个自定义ransack谓词,这应该可以对您的标记进行简单的更改:

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

更新

这样:formatter做并没有达到我的想法,并且由于Ransack存储库如何不提及“子查询”,毕竟您可能无法将其用于您想做的事情。所有可用的选项似乎都已用尽,因此只剩下猴子补丁了。

为什么不像过去通常使用活动记录(甚至使用现在的Arel查询)那样跳过ransack并查询“照片”表?您已经知道查询有效。您希望从使用Ransack获益吗?



 类似资料:
  • 我已经完成了名称索引。它包含椅子、椅子等数据。 当我尝试用“cha”搜索时,它不会返回任何椅子。这是返回“毛毯”,我期待的文件有椅子。 下面是我的代码: 搜索请求: 搜索响应: } 映射: 我该怎么解决这个问题? 谢谢,Sri

  • 问题内容: 我想编写一个SQL查询,该查询在文本字段中搜索关键字,但是仅当它是“全字匹配”时(例如,当我搜索“ rid”时,它不应该与“ arid”匹配,但是应该匹配“摆脱”。 我正在使用MySQL。 幸运的是,在该应用程序中性能并不是至关重要的,并且数据库大小和字符串大小都非常小,但是我更喜欢在SQL中而不是在PHP中驱动它。 问题答案: 您可以使用和和字边界标记: 2020年更新:(实际上是2

  • 我想通过一个包含EditText和按钮的水平LinearLayout创建一个自定义SearchView。用户在EditText中输入搜索查询。 通常,当我们使用SearchView时,我们 > 通过将可搜索活动配置为在清单意向来声明该活动。 通过使用清单中的meta元素来声明我们的可搜索配置文件。 通过配置 SearchView 启用系统辅助搜索(其中系统将搜索查询传递给可搜索活动、提供语音搜索、

  • 在解析文本数据之后,我得到了。并且我需要搜索它是否存在于类型的变量中。没有到的会话,换句话说,没有分配是否可能? 我是否可以使用其他类型,并具有类似于的功能?

  • 我正在使用elasticsearch elasticsearch-rails的官方gems套件,我在试图索引父/子关系时非常困难,我不确定我的问题是在映射、索引或查询还是在所有这些方面!!所以我不会发布我的代码片段。 是否有以下完整的工作示例: 子索引和父索引的映射 子级和父级的索引/更新/删除 在两个索引上查询高级查询;这意味着我需要用'has_child'查询在父索引上搜索,也需要用'has_

  • 问题内容: 我有一个包含两个主表和一个数据库。它们之间存在多对多的关系。我想知道的是如何使用SQL使用多个标签搜索笔记? 例如,如果我有一个带有三个标签“一个”,“两个”和“三个”的注释“ test”,而我有一个带有标签“一个”和“两个”的第二个注释“ test2”,那么将执行什么SQL查询找到与标签“一个”和“两个”相关联的所有注释? 问题答案: 要获取 同时 带有标签“ One”和“ Two”