过滤具有至少3个“最近”多态关联的记录的范围

时间:2017-04-12 02:56:14

标签: ruby-on-rails activerecord polymorphic-associations

我正在开发具有PublicationObservationSpecies模型的rails4应用程序,其中的记录可由用户“验证”(Devise User模型)通过多态关联(Validation模型)。

如果自上次更新发布以来至少有三个用户验证了出版物(即validation.updated_at >= publication.updated_at至少3次验证),则出版物(及其通过关联的HABTM模型的元数据)被视为“已验证”。实施此条件是为了在用户验证后发布的信息发生变化时,不会计算那些特定的“过时”验证,直到用户重新验证(通过关联上的touch)。

我试图找出如何为scope :validated模型生成scope :unvalidatedPublication(即仅过滤经过验证的出版物)。

class Publication < ActiveRecord::Base
  has_and_belongs_to_many :users        // authors of that publication
  has_many :validations, as: :validatable
  has_many :validation_users, through: :validations, source: :user
 end

class Validation < ActiveRecord::Base
  belongs_to :validatable, polymorphic: true
  belongs_to :user
end

class User < ActiveRecord::Base
  has_many :validations
end

我可以检索至少有3次验证的出版物,如下所示(类似于this) - 但是我怎样才能最好地检索(最好作为范围)只有那些在最后一次更新后更新至少3次验证的出版物。出版物?

Publication.select("publications.*, count(validations.id) as validations_count").joins(:validations).group("publications.id").having("validations_count > 2")

1 个答案:

答案 0 :(得分:0)

您只需要添加上述条件:

Publication.
  select("publications.*, count(validations.id) as validations_count").
  joins(:validations).
  where("validations.updated_at >= publications.updated_at").
  group("publications.id").
  having("validations_count > 2")