Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby-on-rails-4/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 父母在多对多关系中拥有所有子女群体_Mysql_Ruby On Rails 4_Join_Has Many Through - Fatal编程技术网

Mysql 父母在多对多关系中拥有所有子女群体

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)])} 是否可以通过这

我真的不确定正确的术语,所以我无法找到任何帮助

使用Rails 4,我通过Film_标签在Film和Tag之间建立了多对多关系。我想范围电影只返回电影,其中包含一组标签。例如,动作片和喜剧都是标签,我想搜索同时有这两个标签的电影。目前,我的系统意外地执行“或”搜索,以便返回所有包含动作或喜剧的电影:

电影:

电影标签:

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