Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ruby-on-rails/54.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和mongoid的关联性?_Ruby On Rails_Mongoid_Has Many - Fatal编程技术网

Ruby on rails 如何通过“查找”找到记录;计数“;使用rails和mongoid的关联性?

Ruby on rails 如何通过“查找”找到记录;计数“;使用rails和mongoid的关联性?,ruby-on-rails,mongoid,has-many,Ruby On Rails,Mongoid,Has Many,对于这些型号: class Week has_many :proofs end class Proof belongs_to :week end 我想做一些类似的事情: Week.where(:proof.count.gt => 0) 只找到有多个证据的星期 有一个答案似乎可以解决这个问题: 但在本例中,由于ID与证明一起存储,因此没有“每周证明ID”这样的属性。这不起作用,例如: Week.where(:proof_ids.gt => 0) 这个查询怎么可能?概念上

对于这些型号:

class Week
  has_many :proofs
end
class Proof
  belongs_to :week
end
我想做一些类似的事情:

Week.where(:proof.count.gt => 0)
只找到有多个证据的星期

有一个答案似乎可以解决这个问题:

但在本例中,由于ID与证明一起存储,因此没有“每周证明ID”这样的属性。这不起作用,例如:

Week.where(:proof_ids.gt => 0)
这个查询怎么可能?概念上很简单,但我不知道如何使用mongo或mongoid实现这一点

类似地,我想按证据的数量排序,例如:

Week.desc(:proofs.size)
但这也不起作用

我确实意识到计数器缓存是我的两个具体问题的一个选项,但我也希望能够进行查询


提前感谢您的帮助。

如果我离您太远了,请原谅-您能使用weeks表中的简单计数器缓存吗?然后你可以做一些像week.proof\u count这样的事情。

使用rails(没有计数器缓存),你可以做:

class Week < ActiveRecord::Base
  has_many :proofs

  def self.by_proofs_size
    sort_by { |week| week.proofs.size }
  end

  def self.with_at_least_n_proofs(n = 1)
    select { |week| week.proofs.size >= n }
  end
end
理想情况可能是使用计数器缓存

scope :with_at_least_n_proofs, -> (n = 1) { where('proofs_count >= ?', n) }
scope :by_proofs_size, -> { order(proofs_count: :desc) }

我不知道这是否是最好的解决方案,因为它通过一个数组来映射它,但这样做了:(这里提到的其他解决方案给了我例外)

classweek{any_in(:_id=>includes(:proof)。选择{w | w.proof.size>0}.map{r | r.id}}
结束

是的,正如我在问题中所说的,我知道计数器缓存是一个选项,但在这种情况下,如果可能的话,我宁愿进行查询。如果这不起作用,那么我肯定会做计数器缓存。你可以删除include(:proof)来提高性能。目前,您正在将所有数据加载到:proof中,而您真正需要的是一个快速计数查询。试一试。它会扼杀你的申请,因为你将收到从数据库到内存的所有证据application@antiqe这就是我提到使用计数器缓存的原因
scope :with_at_least_n_proofs, -> (n = 1) { where('proofs_count >= ?', n) }
scope :by_proofs_size, -> { order(proofs_count: :desc) }
class Week < ActiveRecord::Base

  scope :has_proofs, -> { any_in(:_id => includes(:proofs).select{ |w| w.proofs.size > 0 }.map{ |r| r.id }) }

end