Rails 5使用活动记录选择第三个模型上没有id引用的位置

时间:2018-03-27 19:37:36

标签: ruby-on-rails ruby postgresql activerecord

我有3个型号,Client,Book,ClientBook。 ClientBook属于Client和Book。这个模型(ClientBook)保留了客户已经阅读或阅读的所有书籍。

我想从Books中选择,我想使用活动记录选择客户尚未购买或阅读的所有书籍,例如:

@books_to_offer = Book.all

我希望明确,如果您需要更多信息,请询问。感谢

3 个答案:

答案 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首先被查询到内存中。