我有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关联实现同样的目标?
如果我有更好的方法可以帮助我,如果我错了,我可以帮助我。
答案 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 nil和OR operator in WHERE clause with Arel in Rails 4.2
我认为,您当前的代码是您在Rails 4.2中可以做的最好的代码