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

Rails:有很多通过关联找到的-AND条件,而不是OR条件

东门修能
2023-03-14
问题内容

我的ActiveRecord模型中有以下查询方法:

def self.tagged_with( string )
    array = string.split(',').map{ |s| s.lstrip }
    select('distinct photos.*').joins(:tags).where('tags.name' => array )
end

因此,这将查找所有具有从逗号分隔的列表中获取的标签并转换为数组的标签的记录。

目前,这会匹配带有ANY匹配标签的记录-如何使其在匹配所有标签的地方工作。

IE:如果当前如果我输入:“ blue,red”,那么我将获得所有标记为blue或red的记录。

我想匹配所有标有蓝色和红色的记录。

有什么建议吗?

- 编辑 -

我的模型是这样的:

class Photo < ActiveRecord::Base
  ...
  has_many :taggings, :dependent => :destroy
  has_many :tags, :through => :taggings
  ...
  def self.tagged_with( string )
    array = string.split(',').map{ |s| s.lstrip }
    select('distinct photos.*').joins(:tags).where('tags.name' => array )
  end
  ...
end

class Tag < ActiveRecord::Base
  has_many :taggings, :dependent => :destroy
  has_many :photos, :through => :taggings
end

class Tagging < ActiveRecord::Base
  belongs_to :photo
  belongs_to :tag
end

标签具有两个属性:ID和Name(字符串)。


问题答案:

这应该工作:

def self.tagged_with( string )
  array = string.split(',').map{ |s| s.lstrip }
  select('distinct photos.*').
    joins(:tags).
    where('tags.name' => array).
    group("photos.id").
    having("count(*) = #{array.size}")
end

上方将匹配 至少 带有红色和蓝色标签的照片。因此,这意味着如果一张照片带有红色,蓝色 绿色标签,那么该照片也将匹配。



 类似资料:
  • 问题内容: 我有2个Java类和,它们都存在于数据库中。 人: 关系: 每个人都有(或没有)关系列表,当关系的child_id或parent_id等于该人的id时,应将关系添加到列表中。 TL; DR:当=>将关系添加到与人的关系列表中时 我面临的问题是该注释: 创建以下SQL(只是必要的部分): Java Hibernate中正确的注释是什么,以生成一条用 OR* 代替 AND 的SQL语句 *

  • 问题内容: 在带有mysql的Rails 3中,假设我有两个模型,Customers和Purchases,显然是purchase_to customer。我想找到2个或更多订单的所有客户。我可以简单地说: 有效地,上面的行查询Customer.all和Purchase.all的大小,然后在ruby中进行“选择”类型的处理。在大型数据库中,我更希望避免在ruby中进行所有这种“选择”计算,而让mys

  • 问题内容: 当前试图用a编写select语句,并且搜索条件使我有些悲痛。 目的是搜索具有3种不同参数类型的表,并相应地对输出进行排名。(下面是我的代码示例) 关键搜索条件(必须且加权为1) 其他必备(加权.8) 很高兴(加权.5) SQL: 上面的语句不返回任何内容,我怀疑它是否有可能以上述方式堆叠术语。 返回的结果必须同时拥有会计和经理,并且很高兴拥有Excel 有什么建议可以实现这一目标吗?

  • 问题内容: 是否可以通用地参数化接受EITHER ClassA或InterfaceB的方法? 由于|无法编译 伪码 即我不想编写多个方法签名,而是希望此方法接受Number或CharSequence作为参数 应该通过数字或CharSequence参数传递 问题答案: 如果您 确实 想这样做,则需要将您接受的类包装在自己的自定义类中。在您的示例情况下,可能类似于: 您的方法变为: 然后,您可以构建其

  • 问题内容: 当表较小时,此查询具有合理的时间。我正在尝试确定什么是瓶颈,但是我不确定如何分析结果。 我已经尝试了INNER JOIN’ing和表的方法以及执行INNER SELECT的方法。两者有相同的时间。 这是EXPLAIN的链接:https : //explain.depesz.com/s/9lhr Postgres版本: x86_64-unknown-linux-gnu上的PostgreS

  • 我有两个实体与单向@OneTo多项映射: 我想获得所有B实体的列表,它们是匹配限制的A实体的子实体。 这就是我卡住的地方:c.list()将返回给我一个对象列表。我不关心A,我想要B。我如何使用Hibernate标准/预测来完成它?如果有关系,我使用Hibernate 4.2.12 在这种简化的情况下,只是急切地去拿是有意义的;在真实的例子中,有一个由四个一对一的单向关联组成的链,我想让所有(或者