首页 > 解决方案 > 如何将记录关系与同一模型的另一个模型关系结合起来?

问题描述

考虑在 Rails 6.1 中使用 postgresql 的这个例子:

一个organizationusers&pictures

一个itemhas_and_belongs_to_manypictures和 belongs_to 一个organization

一个userhas_and_belongs_to_manyitems和 belongs_to an organization,有关系has_many :pictures, through: :items

pictures属于一个organization& has_and_belongs_to_manyusers

pictures只能由组织的管理员查看,并且这些用户拥有/属于他们。因此,对于做一些简单的事情的用户来说,current_user.pictures他们会向他们展示他们被允许查看的所有图片。(在此示例中,管理员上传图片并与某些用户共享)

这就是我的问题所在:

图片也可以标记为public,这将允许任何用户在他们的列表中查看它们。所以本质上我想将organization.pictures.where(public: true)and current_user.pictures(它使用一个连接表)组合到一个查询中,并且还可以轻松添加任何 sql 顺序或分页。

我可以简单地使用连接current_user.pictures + organization.pictures.where(public: true),但它返回一个数组,然后我必须使用数组方法来排序和分页,这是不可取的。

我还有什么其他选择?我似乎也无法.or工作。

更新:我认为最初会“工作”的解决方案是我现在正在使用的解决方案,从两个连接表中提取 id has_many :pictures, through: :items,但我仍然对更好的方法感到好奇;在用户模型中:

def viewable_pictures
  pictures_ids = pictures.pluck(:id)
  organization.pictures.public_to_daycare.or(Picture.where(id: pictures_ids))
end

标签: ruby-on-railspostgresqlruby-on-rails-6.1

解决方案


在这种情况下,我会认为是来自图片模型而不是组织对象的查询。就像是:

Picture.where(public: true, organization_id: organization.id).or(Picture.where(user_id: current_user.id)

推荐阅读