Как отсортировать столбец jquery datatables для связанных записей в рельсах

В моем приложении rails я использую jquery-datatables-rails, Это хорошо работает для одной модели. Но если у меня есть связанная модель, то я не знаю, как использовать функцию sort_column. Мой код ниже 0.

delegate :params, :h, :link_to, :image_tag, :edit_product_path, to: :@view

  def initialize(view)
    @view = view
  end

  def as_json(options = {})
    {
        sEcho: params[:sEcho].to_i,
        iTotalRecords: Product.count,
        iTotalDisplayRecords: products.total_entries,
        aaData: data
    }
  end

  private

  def data
[
          product.name,
          product.number,
          product.owner_email
      ]
  end

def products
    @products||= fetch_products
  end

  def fetch_products
    products= Product.order("#{sort_column} #{sort_direction}")
    products= products.page(page).per_page(per_page)
    if params[:sSearch].present?
      products= products.where("namelike :search", search: "%#{params[:sSearch]}%")
    end
    products
  end

  def page
    params[:iDisplayStart].to_i/per_page + 1
  end

  def per_page
    params[:iDisplayLength].to_i > 0 ? params[:iDisplayLength].to_i : 10
  end

  def sort_column
    columns = %w[name number owner_email]
    columns[params[:iSortCol_0].to_i]
  end

  def sort_direction
    params[:sSortDir_0] == "desc" ? "desc" : "asc"
  end

Мой product.rb

class Product < ActiveRecord::Base
  delegate :email, to: :owner, allow_nil: true, prefix: true
  belongs_to :owner, :class_name => "Owner"

как видите, в sort_column метод, который я использую owner.email так как в data метод у меня есть product.owner.email, Но это не сортирует таблицу. Я думаю, что это не правильный способ его использования. Здесь продукт и владелец - две разные модели с отношением has_many. Пожалуйста, дайте мне знать, как я могу заставить это работать.

1 ответ

products= Product.order("#{sort_column} #{sort_direction}")

Здесь происходит сортировка. Если sort_column является owner.email тогда вам нужно owners таблица должна быть предварительно загружена вместе с products Таблица. Так что вам нужно это joins:

products= Product.joins(:owner).order("#{sort_column} #{sort_direction}")

и имя во множественном числе sort_columns:

columns = %w[name number owners.email]

Но нам не нужно загружать owners таблица при сортировке по именным и числовым столбцам. Чтобы решить эту проблему, лучше определить метод, который возвращает имя отношения по имени столбца поиска:

def joins_relation(column)
  case column
  when 'owners.email'
    :owner
  else
    nil
  end
end

И используйте это так:

products= Product.joins(joins_relation(sort_column)).order("#{sort_column} #{sort_direction}")
Другие вопросы по тегам