如何在 Rails 6 中正确执行多对多查询

How to correctly do a many to many query in Rails 6

在 Rails 6.

中的多对多关系中执行下一个查询的最佳方法是什么

这是我的结构:

class Contact < ApplicationRecord
  has_and_belongs_to_many :lists
end

class List < ApplicationRecord    
  has_and_belongs_to_many :contacts
end

这是迁移文件:

class AddContactsListsRelation < ActiveRecord::Migration[6.0]
  def change
    create_table :contacts_lists do |t|
      t.belongs_to :contact
      t.belongs_to :list
    end
  end
end

这是我的查询:

class ContactsLists < ApplicationRecord

  def self.find_with_page(listId, paginationQuery)
    contacts = List.find(listId).contacts
    result = contacts.order(created_at: paginationQuery[:order]).limit(paginationQuery[:page_size])
               .offset(paginationQuery[:page_number] * paginationQuery[:page_size])
    result
  end
end

我不是 Rails 查询 API 方面的专家,但我认为这是执行两个不同查询的次优方式,对吧?

既然你已经定义了多对多的关系,那么你可以很容易地连接表。

您需要获取联系人,这应该是构建查询的 "base" 模型,例如:

Contact
  .joins(:lists)
  .where(list_id: listId)
  .order(created_at: paginationQuery[:order]
  .limit(paginationQuery[:page_size])
  .offset(paginationQuery[:page_number] * paginationQuery[:page_size])

这应该有效:

def self.find_with_page(list_id, pagination_query)
  Contact.joins(:lists)
         .where(lists: { id: list_id })
         .order(created_at: pagination_query[:order])
         .limit(pagination_query[:page_size])
         .offset(pagination_query[:page_number] * pagination_query[:page_size])
end