如何将孩子和父母的多态结果与has_many关联合并?

时间:2017-05-06 06:54:10

标签: ruby-on-rails activerecord has-many polymorphic-associations

我有3个名为用户,照片和报告

的模型

模型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关联实现同样的目标?

如果我有更好的方法可以帮助我,如果我错了,我可以帮助我。

1 个答案:

答案 0 :(得分: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中可以做的最好的代码