Как правильно выполнять запросы типа многие ко многим в Rails 6 - PullRequest
0 голосов
/ 07 мая 2020

Как лучше всего выполнить следующий запрос в отношении «многие ко многим» в 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

Я не разбираюсь в API запросов Rails, но думаю, что это неоптимальный способ выполнить два разных запроса, верно?

Ответы [ 2 ]

2 голосов
/ 07 мая 2020

Так как вы определили отношение «многие ко многим», вы можете легко объединить таблицы.

Вам необходимо получить контакты, которые должны быть «базовой» моделью для построения вашего запроса, например:

Contact
  .joins(:lists)
  .where(list_id: listId)
  .order(created_at: paginationQuery[:order]
  .limit(paginationQuery[:page_size])
  .offset(paginationQuery[:page_number] * paginationQuery[:page_size])
1 голос
/ 07 мая 2020

Это должно работать:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...