1

Ich habe 3 Modelle User-Namen, Foto undWie werden polymorphe Ergebnisse eines Kindes und Elternteils zusammen mit einer has_many-Assoziation zusammengeführt?

Modell Bericht Report ist eine polymorphe Klasse und verwendet wird, um Benutzer und Fotos und das Modell zu berichten User mit dem Modal Photo eine polymorphe Vereinigung hat.

So die Funktionalität ist ein Benutzer kann Fotos oder andere Benutzer melden.

Unten ist die Migrationsdatei von 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 

und unten sind die Verbände

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 

zur Zeit verwende ich eine Abfrage wie unten angegeben Liste eines Benutzers entweder durch den Anwender zu erhalten oder durch ihre Fotos.

Also, ich möchte gerne wissen, wie kann ich dasselbe mit einer has_many Verbindung erreichen?

Bitte helfen Sie mir, wenn es einen besseren Weg gibt, den ich gleich erreichen oder korrigieren kann, wenn ich falsch liege.

Antwort

0

Schienen sind intelligent genug, um die Klasse der Argumente bei der Filterung durch eine polymorphe Assoziation zu verwenden. Sie können Ihre Bedingung auf eine sehr einfache Art und Weise umschreiben:

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

Dieser Code funktioniert nur in Rails 5.x.

aktualisieren

In Rails 4.2 Dieser Code wird nicht funktionieren. Sie überprüfen können SO Fragen im Zusammenhang: Finding record where polymorphic association or nil und OR operator in WHERE clause with Arel in Rails 4.2

Ich denke, Ihre aktuellen Code der beste ist, dass Sie in Rails 4.2

+0

Dank für die Ausgabe tun können, aber diese Rückkehr Abfrage wie folgt für mich SELECT 'reports'. * FROM 'reports' WHERE' reports'.reported_type' = 'User' UND 'reports'.reported_id' IN (273, 932, 1215, 1216, 1217)' Ich schätze, nur der Benutzer wählt daraus. –

+0

Welche Version von Rails verwenden Sie? –

+0

Ich verwende Schienen 4.2.4 –

Verwandte Themen