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

레일즈는 다형성 연관에 의한 필터링에서 인자의 클래스를 사용할만큼 똑똑합니다. 아주 간단한 방법으로 상태를 다시 작성할 수 있습니다 :

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에서만 작동합니다.

업데이트 레일 4.2에서

이 코드가 작동하지 않습니다. 당신은 질문 SO 관련 체크 할 수 있습니다 Finding record where polymorphic association or nilOR operator in WHERE clause with Arel in Rails 4.2 내가 생각

는, 현재 코드는 당신이 레일에서 출력 4.2

+0

감사를 할 수있는 최선의하지만 나를 위해이 같은이 반환 쿼리가''reports'을 선택합니다. * FROM'reports' WHERE'reports'.reported_type' = 'User'AND'reports'.reported_id' IN (273, 932, 1215, 1216, 1217)'사용자 만이 선택하고있는 것 같습니다. –

+0

어떤 레일 버전을 사용하고 있습니까? –

+0

레일을 사용하고 있습니다. 4.2.4 –