You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Rails多态belongs_to关联下,如何按User的last_name查询Patient?

根据User的last_name搜索Patient的查询方案

没问题,咱们先理清楚模型之间的关联链:Patient 拥有一个 Role(多态关联),而 Role 属于一个 User。要实现通过 User 的 last_name 搜索 Patient,咱们需要把这三层模型关联起来构建查询。

1. 精确匹配查询

如果要精准匹配某一个姓氏,直接用嵌套关联的 joins 加上 where 条件即可:

Patient.joins(role: :user).where(users: { last_name: "Maynard" })

这里的 joins(role: :user) 会自动帮你关联 patients → roles → users 三张表,然后通过 users: { last_name: ... } 指定筛选条件。

2. 模糊匹配查询

如果要实现“包含某字符串”的模糊搜索,就需要用 SQL 的 LIKE(或大小写不敏感的 ILIKE,适配 PostgreSQL):

# 大小写敏感的模糊匹配(比如只匹配"Maynard",不匹配"maynard")
Patient.joins(role: :user).where("users.last_name LIKE ?", "%Maynard%")

# 大小写不敏感的匹配(适配PostgreSQL,其他数据库可能用LOWER函数转换)
Patient.joins(role: :user).where("users.last_name ILIKE ?", "%maynard%")

# 兼容多数数据库的大小写不敏感写法(用LOWER统一转换)
Patient.joins(role: :user).where("LOWER(users.last_name) LIKE ?", "%maynard%")

3. 保留无关联的Patient(可选)

默认的 joins 是内连接,会过滤掉没有关联 Role 或 User 的 Patient。如果想保留这些记录(即使它们没有对应的 User 姓氏),可以用 left_joins:

Patient.left_joins(role: :user).where("users.last_name LIKE ?", "%Maynard%")

这种情况下,没有关联 User 的 Patient 会被返回,但对应的 User 字段值为 null。

内容的提问来源于stack exchange,提问作者Erick Maynard

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 09:25:21