Могу ли я отсортировать одну таблицу по информации, содержащейся в неассоциированной другой таблице? - PullRequest
0 голосов
/ 09 декабря 2018

Rails 5.1.6 Ruby 2.5.1

Итак, у меня есть три модели:

class Product < ApplicationRecord
  has_many :order_items, :dependent => :destroy
  belongs_to :product_type
end

class ProductType < ApplicationRecord
  has_many :products
end

class OrderItem < ApplicationRecord
  belongs_to :order
  belongs_to :product
end

Мне нужна возможность сортировать все позиции заказа по типу продукта.В алфавитном порядке по названию типа продукта, который содержится только в таблице типов продуктов.Таблица productd содержит идентификатор product_type_id.Прямо сейчас я сортирую по product_type_id, но это не по алфавиту.Я пытаюсь понять, как я могу отсортировать элементы order_items по информации, содержащейся в несвязанной таблице.Возможно, это невозможно?Как я могу сделать это возможным?

scope :sort_by_product_info, -> {(
  select("order_items.id, order_items.order_id, order_items.product_id, 
  order_items.quantity, products.id, products.name, 
  products.description, products.image, products.size, 
  products.product_type_id")
   .joins(:product)
   .order("products.product_type_id ASC, products.name ASC")
)}

Я думаю, что это не может быть сделано через ActiveRecord, на что я надеялся, но вместо этого я должен использовать сырой SQL здесь.

@products_w_type = <<-SQL
  SELECT * 
  FROM order_items, products, product_types 
  JOIN products 
  ON order_items.product_id = products.id 
  JOIN product_types 
  ON products.product_type_id = product_types.id;
SQL

вышеизложенное дает мне ноль,но я впервые пытаюсь вставить SQL в рельсы.

1 Ответ

0 голосов
/ 09 декабря 2018

Следующая область должна помочь вам отсортировать ее так, как вы хотели:

class OrderItem < ApplicationRecord
  belongs_to :order
  belongs_to :product

  scope :sort_by_product_info, -> { joins(product: :product_type).
                                    order('product_types.name ASC, products.name ASC') }
end

Также можно использовать хитрый прием для проверки базового запроса SQL с помощью метода .explain в консоли:

OrderItem.sort_by_product_info.explain
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...