Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/62.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
Ruby on rails 与双深度关联模型的计数属性相结合存在_的Rails_Ruby On Rails_Activerecord - Fatal编程技术网

Ruby on rails 与双深度关联模型的计数属性相结合存在_的Rails

Ruby on rails 与双深度关联模型的计数属性相结合存在_的Rails,ruby-on-rails,activerecord,Ruby On Rails,Activerecord,我有一个Filter对象,它有许多与之关联的relevancelabel。相关标签属于文章 我试图做一个丑陋的查询:我想找到所有过滤器,它们至少有10个相关标签,其中每个相关标签的文章没有零标记向量 我目前正在使用where_existsgem,这使第一部分变得简单: streams\u with\u labels=Filter.where\u存在(:相关性\u labels) 但我仍然在循环中使用丑陋: stream=Filter.find(Filter\u id) labels=stream

我有一个
Filter
对象,它有许多与之关联的
relevancelabel
相关标签
属于
文章

我试图做一个丑陋的查询:我想找到所有
过滤器,它们至少有10个
相关标签
,其中每个
相关标签
文章
没有
标记向量

我目前正在使用
where_exists
gem,这使第一部分变得简单:

streams\u with\u labels=Filter.where\u存在(:相关性\u labels)

但我仍然在循环中使用丑陋:

stream=Filter.find(Filter\u id)
labels=stream.relevance\u标签
如果标签长度<10,则返回
labels_with_tokens=labels.reject{| label | label.article.token_vector.nil}
如果标签_带有_标记,则返回。长度<10
...

我确信有一些链接正在逃离我,但我甚至不确定从何处开始。

您可能想在这里做的是围绕
过滤器进行分组。id
并添加一个子句为每个组添加一个条件:

class Filter < ApplicationRecord
  has_many :relevance_labels 
  has_many :articles, through: :relevance_labels 

  def self.with_articles(n = 10)
    joins(:articles)
      .group(:id) # filters.id
      .where.not(articles: { token_vector: nil })
      .having(
        Article.arel_table[Arel.star].count.gte(n)
      )
  end
end
类过滤器

Article.arel\u table[arel.star].count.gte(n)
是一种更方便的编写
的方法,它拥有(“count(articles.*>=?”,?)

您可能想在这里做的只是分组
过滤器.id
,并添加一个子句来为每个组添加一个条件:

class Filter < ApplicationRecord
  has_many :relevance_labels 
  has_many :articles, through: :relevance_labels 

  def self.with_articles(n = 10)
    joins(:articles)
      .group(:id) # filters.id
      .where.not(articles: { token_vector: nil })
      .having(
        Article.arel_table[Arel.star].count.gte(n)
      )
  end
end
类过滤器
Article.arel\u表[arel.star].count.gte(n)
是一种更方便的书写
的方法,它拥有(“count(articles.*>=?”,?)