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

Rails 5 ActiveRecord查询:获取客户未购买/未阅读的书籍

查询客户未购买/阅读的书籍

嘿,我来帮你搞定这个ActiveRecord查询需求!首先咱们得确保模型之间的关联已经正确配置,这是后续查询的基础:

模型关联配置

先把三个模型的关联代码补全(如果还没设置的话):

Client 模型

class Client < ApplicationRecord
  has_many :client_books
  has_many :books, through: :client_books
end

Book 模型

class Book < ApplicationRecord
  has_many :client_books
  has_many :clients, through: :client_books
end

ClientBook 模型

class ClientBook < ApplicationRecord
  belongs_to :client
  belongs_to :book
end

实现查询的几种方式

假设你已经有一个代表目标客户的实例@client,下面是几种高效的查询方法:

方法1:利用关联的ID数组(最简洁)

直接通过@client.book_ids获取该客户已关联书籍的ID列表,再用where.not排除这些书籍:

@books_to_offer = Book.where.not(id: @client.book_ids)

方法2:子查询方式(更直接关联中间表)

如果想直接从ClientBook表筛选已关联的书籍ID,也可以这么写:

@books_to_offer = Book.where.not(id: ClientBook.where(client_id: @client.id).select(:book_id))

方法3:左外连接方式(适合复杂条件扩展)

通过左外连接client_books表,筛选出没有对应关联记录的书籍:

@books_to_offer = Book.left_outer_joins(:client_books)
                      .where(client_books: { client_id: @client.id })
                      .where(client_books: { id: nil })

这几种方法都能实现你的需求,其中方法1最简洁易读,日常开发中用得最多~

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.21 04:30:01