我有两个与HABTM相关联的模型(实际上在两端都使用了has_many :through,以及一个连接表)。我需要检索与两个ModelB都关联的所有ModelA。我不希望ModelB_1的所有模型A与ModelB_2的所有模型A连接在一起。我真的希望所有的模型A都与ModelB_1和ModelB_2相关联。它不仅限于2个模型B,它可能多达50个模型B,所以这必须进行扩展。
我可以使用各种类比来描述这个问题,我认为这些类比比上一段更好地描述了我的问题:
* 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。
你将如何解决这个问题?
发布于 2009-07-08 14:58:27
您可以执行以下操作:
where ModelB = 'ModelB_1' or ModelB = 'ModelB_2')。使用此查询,结果集将有多个' ModelA‘行,每个满足的ModelB条件恰好对应一行。count(*)等于所需的ModelB条件数的行
示例:
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参数中。
https://stackoverflow.com/questions/1095571
复制相似问题