首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >HABTM查找时使用"AND“连接,而不是"OR”

HABTM查找时使用"AND“连接,而不是"OR”
EN

Stack Overflow用户
提问于 2009-07-08 00:43:18
回答 1查看 429关注 0票数 3

我有两个与HABTM相关联的模型(实际上在两端都使用了has_many :through,以及一个连接表)。我需要检索与两个ModelB都关联的所有ModelA。我不希望ModelB_1的所有模型A与ModelB_2的所有模型A连接在一起。我真的希望所有的模型A都与ModelB_1和ModelB_2相关联。它不仅限于2个模型B,它可能多达50个模型B,所以这必须进行扩展。

我可以使用各种类比来描述这个问题,我认为这些类比比上一段更好地描述了我的问题:

代码语言:javascript
复制
* Find all books that were written by all 3 authors together.
* Find all movies that had the following 4 actors in them.
* Find all blog posts that belonged to BOTH the Rails and Ruby categories for each post.
* Find all users that had all 5 of the following tags: funny, thirsty, smart, thoughtful, and quick.   (silly example!)
* Find all people that have worked in both San Francisco AND San Jose AND New York AND Paris in their lifetimes.

我想过各种各样的方法来实现这一点,但它们的效率非常低,而且非常不受欢迎。

打个比方,比如最后一个,你可以对每个城市的所有人进行查询,然后在每个数组中找到存在于每个数组中的项。这至少是5个查询,这些查询的所有数据都被传输回应用程序,然后应用程序必须密集地将所有5个数组相互比较(循环很多!)。这很下流,对吧?

另一种可能的解决方案是将查找结果链接到彼此的顶部,这实际上与上面的操作相同,但不会消除多个查询和处理。此外,如果用户提交的复选框或值可能高达50个选项,您将如何动态化该链?看起来很下流。你需要一个循环。再说一次,这会加剧搜索持续时间。

显然,如果可能的话,我们希望让数据库为我们执行此操作,因此,人们建议我简单地添加多个条件。不幸的是,您通常只能对HABTM执行OR操作。

我遇到的另一个解决方案是使用搜索引擎,如sphinx或UltraSphinx。对于我的特殊情况,我觉得这有点过头了,我宁愿避免它。我仍然觉得应该有一个解决方案,让用户可以为任意数量的ModelB创建查询,并找到所有的ModelA。

你将如何解决这个问题?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2009-07-08 14:58:27

您可以执行以下操作:

  1. 从您的ModelA构建查询,连接ModelB (通过连接模型),过滤具有您要查找的值之一的ModelB,即将它们放入OR (即where ModelB = 'ModelB_1' or ModelB = 'ModelB_2')。使用此查询,结果集将有多个' ModelA‘行,每个满足的ModelB条件恰好对应一行。
  2. 将group by条件添加到查询所需的ModelA列(如果需要,甚至包括所有列)。每一行的ModelB ()数等于‘satisfied*.
  3. add’条件的数量,只选择count(*)等于

所需的ModelB条件数的行

示例:

代码语言:javascript
复制
model_bs_to_find = [100, 200]
ModelA.all( :joins=>{:model_a_to_b=>:model_bs}, 
            :group=>"model_as.id", 
            :select=>"model_as.*",
            :conditions=>["model_bs.id in (?)", model_bs_to_find], 
            :having=>"count(*)=#{model_bs_to_find.size}")

注:以这种方式指定的group和select参数将在MySQL中工作,标准的方法是将model_as列的整个列表同时放入group和select参数中。

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/1095571

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档