ruby-on-rails - 如何将记录关系与同一模型的另一个模型关系结合起来?
问题描述
考虑在 Rails 6.1 中使用 postgresql 的这个例子:
一个organization
有users
&pictures
一个item
has_and_belongs_to_manypictures
和 belongs_to 一个organization
一个user
has_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
解决方案
在这种情况下,我会认为是来自图片模型而不是组织对象的查询。就像是:
Picture.where(public: true, organization_id: organization.id).or(Picture.where(user_id: current_user.id)
推荐阅读
- reactjs - 即使道具保持不变也触发useEffect?
- dart - 如何在 Dart Aqueduct 服务器中获取请求标头
- sql-server - 具有固定参数的 SQL Server 用户定义函数
- php - PHP mysqli 多个查询 bind_param 崩溃
- regex - 匹配运算符左侧的数组
- javascript - 如何使用 javascript 用动态内容覆盖子节点值
- java - 如何自下而上在网格中添加对象?
- javascript - 我们如何使用 mysqli 将包含来自 xml http 请求的文本的数组发送到 PHP?
- dask - 创建后是否可以将工作人员资源分配给分布式工作人员?
- reactjs - 为什么只有从循环生成的元素才能获得“关键”属性?