Ruby on Rails ActiveRecord:为ProjectUser定义general_messages关联
解决方案
在ProjectUser模型中定义如下has_many关联即可满足需求:
class ProjectUser < ApplicationRecord belongs_to :user has_many :general_messages, class_name: "Message", -> { where( "(messages.item_id = project_users.id AND messages.item_type = ?) OR (messages.item_id = users.id AND messages.item_type = ?)", ProjectUser.name, User.name ) }, joins: :user end
说明
- 关联基础配置:
class_name: "Message"指定关联的模型为Message,因为关联名称general_messages和模型名不一致。 - 查询条件定义:通过lambda设置的where条件,精准筛选出两类消息:
- 直接关联当前
ProjectUser的消息(匹配item_id为project_users.id且item_type为ProjectUser) - 关联当前
ProjectUser所属User的消息(匹配item_id为users.id且item_type为User)
- 直接关联当前
- 自动关联用户表:
joins: :user确保在执行集合查询(如ProjectUser.joins(:general_messages))时,ActiveRecord会自动连接users表,保证users.id能被正确引用。
用法示例
你可以像使用常规ActiveRecord关联一样进行链式调用:
# 筛选所有包含特定内容的general_messages的ProjectUser ProjectUser.joins(:general_messages).where(general_messages: { content: "重要通知" }) # 获取某个ProjectUser实例的所有general_messages project_user = ProjectUser.find(1) project_user.general_messages
内容的提问来源于stack exchange,提问作者Ric Donati
相关产品推荐
相关产品推荐

