如何对rails中关联记录的jquery数据表列进行排序

Posted

技术标签:

【中文标题】如何对rails中关联记录的jquery数据表列进行排序【英文标题】:How to sort jquery datatables column for associated records in rails 【发布时间】:2016-04-02 08:48:13 【问题描述】:

在我的 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

我的产品.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_columnowner.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")

【讨论】:

您是否将此代码添加到产品模型中?您是否将data 中的product.owner.email 更改为product.owner_email 对不起!我必须在我的产品模型中添加什么?我没有在产品模型中添加任何东西 我的回答中的一行代码。它允许您调用product.owner_email 而不是product.owner.email。您还需要在数据表初始化期间正确指定列名,以便iSortCol_0 参数包含owner_email 对应列的值。 请查看我更新的问题以及您给定的更改。但还是不行 好吧,对不起,我的回答错了。我没有太注意代码。还原更改并查看更新的答案。

以上是关于如何对rails中关联记录的jquery数据表列进行排序的主要内容,如果未能解决你的问题,请参考以下文章

通过rails中关联模型的子类查询

获取Rails模型中关联列的总和

LR中关联总结

数据库之左关联右关联等值关联

如何覆盖 Grails GORM 中关系的级联删除?

如何使用_id(node.js)检索mongoDB中关联的子文档