我有3个型号,Client,Book,ClientBook。 ClientBook属于Client和Book。这个模型(ClientBook)保留了客户已经阅读或阅读的所有书籍。
我想从Books中选择,我想使用活动记录选择客户尚未购买或阅读的所有书籍,例如:
@books_to_offer = Book.all
我希望明确,如果您需要更多信息,请询问。感谢
答案 0 :(得分:4)
你想要这样的东西:
# models/book.rb
class Book < ApplicationRecord
has_many :client_books
has_many :clients, through: :client_books
scope :unread_by, -> (client) { where.not(id: client.books) }
end
# models/client.rb
class Client < ApplicationRecord
has_many :client_books
has_many :books, through: :client_books
end
现在你可以做到:
>> client = Client.find(1)
>> Book.unread_by(client)
#> <ActiveRecord::Relation ...>
答案 1 :(得分:0)
假设你有一个has_many通过(Client&gt; ClientBook&gt; Book),你可以尝试:
Books.where.not(Client.first.book_ids)
参考文献:
http://guides.rubyonrails.org/association_basics.html#has-and-belongs-to-many-association-reference http://guides.rubyonrails.org/active_record_querying.html#not-conditions
答案 2 :(得分:0)
我会这样做:
@books_to_offer = Book.where.not(id: @client.books.select(:id))
使用#select
允许Rails将其组合到单个查询中,从而防止客户端书籍对象甚至ID首先被查询到内存中。