【问题标题】:Scope to filter records with at least 3 "recent" polymorphic associations筛选具有至少 3 个“最近”多态关联的记录的范围
【发布时间】:2017-04-12 02:56:14
【问题描述】:

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

如果出版物自上次更新以来至少由三个用户验证(即validation.updated_at >= publication.updated_at 至少 3 个验证),则认为出版物(及其通过相关 HABTM 模型的元数据)已“验证”。实施此标准后,如果发布信息在用户验证后发生更改,则不计算那些特定的“过时”验证,直到用户重新验证(通过关联上的 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")

【问题讨论】:

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


    【解决方案1】:

    您只需要添加提到的条件:

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

    【讨论】:

    • 非常感谢!我曾尝试过,但现在发现它以前不起作用,因为我认为 @publications.count (这会产生 SQL 错误)。你知道为什么我不能对结果执行.count 吗?另外 - 做相反的事情(找到未验证的记录),我假设我需要做一个左连接 (include) 以还包括具有 0 个验证的出版物 - 但是这会给 validations_count?我怎么能解决这个问题?
    • 1. count 是 Rails 中的一个特殊词,可能最好将列重命名,例如,改为 counter。 2. 在 Rails 5.0 中你可以调用left_joins(:validations),在 Rails 4.2 中你需要将 join 写成字符串joins("LEFT JOIN validations ON publications.id = validations.publication_id")。此外,您应该删除 having 条件。
    猜你喜欢
    • 1970-01-01
    • 2022-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-22
    相关资源
    最近更新 更多