1

私は、ユーザーという名前の3つのモデルを持っている写真と子と親のポリモーフィックな結果をhas_many関連とともにマージするには?

モデルReportの報告は、多型クラスであり、モーダルPhotoとポリモーフィックな関連を持ってUserユーザーと写真やモデルを報告するために使用されます。

この機能は、ユーザーが写真や他のユーザーに報告できることです。

以下は、マイグレーションファイル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,127)'私はこれからユーザーが選んだと思います。 –

+0

あなたはどのバージョンのRailsを使用していますか? –

+0

私はレールを使用しています。4.2.4 –

関連する問題