Как отсортировать столбец 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}")