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

