如何在 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
在 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