Mysql 父母在多对多关系中拥有所有子女群体
我真的不确定正确的术语,所以我无法找到任何帮助 使用Rails 4,我通过Film_标签在Film和Tag之间建立了多对多关系。我想范围电影只返回电影,其中包含一组标签。例如,动作片和喜剧都是标签,我想搜索同时有这两个标签的电影。目前,我的系统意外地执行“或”搜索,以便返回所有包含动作或喜剧的电影: 电影: 电影标签:Mysql 父母在多对多关系中拥有所有子女群体,mysql,ruby-on-rails-4,join,has-many-through,Mysql,Ruby On Rails 4,Join,Has Many Through,我真的不确定正确的术语,所以我无法找到任何帮助 使用Rails 4,我通过Film_标签在Film和Tag之间建立了多对多关系。我想范围电影只返回电影,其中包含一组标签。例如,动作片和喜剧都是标签,我想搜索同时有这两个标签的电影。目前,我的系统意外地执行“或”搜索,以便返回所有包含动作或喜剧的电影: 电影: 电影标签: scope :tags, ->(tags) {where(['film_tags.tag_id IN (?)',tags.map(&:id)])} 是否可以通过这
scope :tags, ->(tags) {where(['film_tags.tag_id IN (?)',tags.map(&:id)])}
是否可以通过这两个标记进行过滤,以便我可以在之后继续链接作用域?您可以使用
group
和have
语句来构建这样的作用域(未经测试):
你的
join
是film\u tags
(joins(:film\u tags)
)的复数形式,不是吗?哦,是的,它在我的代码中,只是这里的一个输入错误。你看到我的答案了吗?有用吗?我现在正在实施它。谢谢你的帮助。是的,很有效,谢谢。
scope :tags, ->(tags) {where(['film_tags.tag_id IN (?)',tags.map(&:id)])}
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
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