2017-04-12 56 views
0

我在具有PublicationObservationSpecies模型,得到用戶的記錄可以被「驗證」一rails4應用程序的工作(設計User模型)多態關聯(Validation模型)。範圍,以通過篩選記錄至少3「近期的」多態關聯

如果出版物自發布最後更新(即至少3次驗證爲validation.updated_at >= publication.updated_at)以來至少有三名用戶驗證,則出版物(及其通過關聯的HABTM模型的元數據)被認爲是「已驗證的」。實施該標準時,如果發佈的信息在用戶驗證後發生變化,那麼這些特定的「過時」驗證不會被計算,直到用戶重新驗證(通過關聯上的touch)。

我試圖找出我怎麼能產生scope :validatedscope :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") 

回答

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

非常感謝您!我曾嘗試過,但現在發現它之前沒有工作,因爲我的視圖中出現了@ @ publications.count(這產生了SQL錯誤)。你會知道爲什麼我不能對結果執行'.count'嗎?另外 - 爲了做相反的事情(找到未驗證的記錄),我假設我需要做一個左連接('include')以包含帶有0個驗證的出版物 - 但是這會給出'validations_count'的問題?我怎麼能解決這個問題? – pimbo

+0

1.「count」是Rails中的一個特殊字,可能更適合將列重命名爲「counter」。 2.在Rails 5.0中,你可以在Rails 4.2中調用'left_joins(:validations)',你需要將連接寫成字符串'joins(「LEFT JOIN驗證ON publication.id = validations.publication_id」)''。你也應該刪除'有'情況。 –