1

我有3種型號命名用戶,照片和報告如何合併has_many關聯的子項和父項的多態性結果?

型號Report是一個多態類和用於報告用戶和照片,模型User與模態Photo多態關聯。

所以功能是用戶可以報告照片或任何其他用戶。

以下是遷移文件Report

class CreateReports < ActiveRecord::Migration 
    def change 
    create_table :reports do |t| 
     t.integer :user_id 
     t.integer :reported_id 
     t.string :reported_type, default: "User" 
     t.string :note, default: "" 
    end 
end 
end 

及以下的關聯

class User < ActiveRecord::Base 
    ... 
    has_many :photos, as: :attachment 
    has_many :reports, dependent: :destroy 
    ... 
end 

class Photo < ActiveRecord::Base 
    ... 
    belongs_to :attachment, :polymorphic: true 
end 

class Report < ActiveRecord::Base 
    belongs_to :user 
    belongs_to :reported, polymorphic: true 
end 

目前我使用的查詢像下面由用戶自己或自己的照片得到報告的用戶列表。

Report.where("(reported_id=? AND reported_type=?) OR (reported_id in (?) AND reported_type=?)", 
    self.id, "User", self.photos.pluck(:id), "Photo") 

所以,我想知道我怎樣才能實現與has_many關聯同樣的事情?

請幫助我,如果有什麼更好的辦法,我可以實現相同或糾正我,如果我錯了。

回答

0

Rails很聰明,可以通過多態關聯過濾參數類。你可以重寫一個非常簡單的方法你的病情:

Report.where(reported: [self] + self.photos) 

# result sql 
SELECT "reports".* 
FROM "reports" 
WHERE (
    ("reports"."reported_type" = 'User' AND "reports"."reported_id" = 1) OR 
    ("reports"."reported_type" = 'Photo' AND "reports"."reported_id" IN (1, 2)) 
) 

此代碼只能在Rails的5.x中

更新

在Rails 4.2的代碼將無法正常工作。您可以檢查與SO問題:Finding record where polymorphic association or nilOR operator in WHERE clause with Arel in Rails 4.2

我認爲,當前的代碼是你可以做的Rails 4.2

+0

謝謝你的輸出最好的,但像這樣對我來說這回查詢''選擇reports'。 * FROM'reports' WHERE'reports'.'reported_type' ='User'AND'reports'.'reported_id' IN(273,932,1215,1216,1217)'我猜測只有用戶正在從中選擇。 –

+0

您使用的是哪個版本的Rails? –

+0

我正在使用rails 4.2.4 –

相關問題