筛选具有至少 3 个 "recent" 多态关联的记录的范围

Scope to filter records with at least 3 "recent" polymorphic associations

我正在开发一个具有 PublicationObservationSpecies 模型的 rails4 应用程序,用户可以 "validated" 记录这些模型(设计 User 模型)通过多态关联(Validation 模型)。

如果该出版物自上次更新以来至少由三个用户验证(即 validation.updated_at >= publication.updated_at 至少 3 次验证,则该出版物(及其通过关联的 HABTM 模型的元数据)被视为 "validated" ).实施此标准后,如果出版物上的信息在用户验证后发生更改,则不会计算这些特定的 "outdated" 验证,直到用户重新验证(通过关联上的 touch)。

我想弄清楚如何为 Publication 模型生成 scope :validatedscope :unvalidated(即仅过滤经过验证的出版物)。

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")

您只需添加上述条件:

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")