ActiveRecord заказывает вложенные элементы - PullRequest
0 голосов
/ 22 февраля 2019

У меня есть модели Ticket и Service

class Ticket < ApplicationRecord
  belongs_to :medic
  has_and_belongs_to_many :services

  validates_presence_of :services
end

class Service < ApplicationRecord
  has_and_belongs_to_many :tickets
end

, а модель Service имеет поля code и name.Таким образом, в таблице services есть записи типа

id |  code  | name 
1  |  5.1   | value 1
2  |  5.2   | value 2
3  |  6.1   | value 3
and so on

Можно ли сделать запрос на получение Билетов, заказанных по имени , включая Услуги, заказанные по коду (например)?

Ticket.includes(:services, :medic)
        .order(date: :desc, created_at: :desc)
        .where(where_conditions)    (works fine, but without services order)

Я что-то сделал, используя Sequelize, но не знаю, как это сделать с помощью ActiveRecord.Я пробовал

Ticket.includes(:services, :medic)
        .order(date: :desc, created_at: :desc, "services.code": :desc)
        .distinct
        .where(where_conditions)

, но получил

ActionView::Template::Error (SQLite3::SQLException: no such column: tickets.services.code: SELECT DISTINCT "tickets".* FROM "tickets" WHERE "tickets"."date" BETWEEN ? AND ? AND "tickets"."enabled" = ? ORDER BY "tickets"."date" DESC, "tickets"."created_at" DESC, "tickets"."services.code" DESC):

Ответы [ 2 ]

0 голосов
/ 22 февраля 2019

Для более «использующих API» решений вы можете использовать Arel:

ticket = Ticket.arel_table
service = Service.arel_table

Ticket.includes(:services, :medic).references(:services)
      .order(ticket[:date].desc, ticket[:created_at].desc, service[:code].desc)
      .distinct
      .where(where_condition)

Или:

Ticket.includes(:services, :medic).references(:services)
      .order(Ticket.arel_table[:date].desc, Ticket.arel_table[:created_at].desc, Service.arel_table[:code].desc)
      .distinct
      .where(where_condition)
0 голосов
/ 22 февраля 2019

Вы можете передать точное выражение order в метод ActiveRecord order строкой:

Ticket.includes(:services, :medic).references(:services)
      .order('tickets.date desc, tickets.created_at desc, services.code desc')
      .distinct
      .where(where_condition)

Обратите внимание, что я также добавил references(:services), чтобы уведомить ActiveRecord о том, что вы хотите поставить какое-то условие илидругое предложение в этой таблице, в противном случае ActiveRecord по умолчанию создает отдельный запрос к БД, без join.

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