gpt4 book ai didi

mysql - parent 拥有多对多关系中的所有 child 组

转载 作者:行者123 更新时间:2023-11-29 00:03:33 24 4
gpt4 key购买 nike

我不太确定正确的术语,所以我找不到任何帮助。

使用 Rails 4,我通过 film_tags 在 Film 和 Tag 之间建立了多对多关系。我想将电影范围限定为仅返回包含一组标签的电影。例如 Action 和喜剧都是标签,我想搜索同时具有这两个标签的电影。目前我的系统不小心做了一个“或”搜索,所以它返回了所有有 Action 或喜剧的电影:

电影:

scope :includes_tags, ->(tags) {joins(:film_tag).merge(FilmTag.tags(tags))}

电影标签:

scope :tags, ->(tags) {where(['film_tags.tag_id IN (?)',tags.map(&:id)])}

是否可以通过这两个标签进行过滤,以便我可以继续在其后链接作用域?

最佳答案

您可以使用 grouphaving 语句来构建您的作用域,如下所示(未经测试):

class Film < ActiveRecord::Base
scope :includes_tags, ->(tags) do
joins(:film_tags).merge(FilmTag.tags(tags))
.group("films.id")
.having("count(film_tags.id) = ?", tags.size)
end
end

如果 Tag 有一个名为 name 的属性,您可以像这样重构代码以获得更好的性能和可读性:

class FilmTag < ActiveRecord::Base
# remove the .tags scope
end

class Film < ActiveRecord::Base
has_many :film_tags
has_many :tags, through: :film_tags

scope :with_all_tag_names, ->(tag_names) do
joins(film_tags: :tags)
.where(tags: { name: tag_names })
.group("films.id")
.having("count(tags.name) = ?", tag_names.size)
end
end

关于mysql - parent 拥有多对多关系中的所有 child 组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28565359/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com