Rails:有很多直通关联——用 AND 条件查找,而不是 OR 条件

发布于 2024-11-04 07:22:14 字数 1023 浏览 2 评论 0原文

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

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

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

目前,这与任何匹配标签的记录相匹配——我怎样才能让它在匹配所有标签的地方工作。

IE:如果当前如果我输入:“蓝色,红色”,那么我会得到带有蓝色或红色标记的所有记录。

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

建议?

-- 编辑 --

我的模型是这样的:

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 和名称(字符串)。

I have the following query method in my ActiveRecord model:

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

So, this finds all records that have tags taken from a comma separated list and converted into an array.

Currently this matches records with ANY matching tags -- how can I make it work where it matches ALL tags.

IE: if currently if I input: "blue, red" then I get all records tagged with blue OR red.

I want to match all records tagged with blue AND red.

Suggestions?

-- EDIT --

My models are like so:

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

A tag has two attributes: ID and Name (string).

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

眼睛会笑 2024-11-11 07:22:14

这应该有效:

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

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

This should work:

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

Above will match photos that have tags red and blue at least. So that means if a photo has red, blue and green tags, that photo would match too.

秋日私语 2024-11-11 07:22:14

您可以将 select 语句更改为以下内容:

select('distinct photos.*').joins(:tags).where('tags.name = ?',  array.join(' OR '))

这将在 where 子句中正确创建 OR 字符串。

伊恩。

You could change your select statement to the following:

select('distinct photos.*').joins(:tags).where('tags.name = ?',  array.join(' OR '))

Which will properly create the OR string in the where clause.

ian.

对风讲故事 2024-11-11 07:22:14

哈哈,这个问题的解决方案不是一个简单的任务——我从 SQL 的角度思考了它,它很丑陋。我想其他人必须尝试过这个,所以我做了一些搜索,发现这篇文章应该对您有帮助:

HABTM 通过“AND”连接查找,而不是“OR”

LOL the solution for this is not a simple task--I thought through it from a SQL standpoint and it was UGLY. I figured somebody else has to have tried this so I did some searching and found this post that should help you:

HABTM finds with "AND" joins, NOT "OR"

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文