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
相关产品推荐
相关产品推荐

