jbox-web / ajax-datatables-rails

A wrapper around DataTable's ajax methods that allow synchronization with server-side pagination in a Rails app
MIT License
590 stars 227 forks source link

Allow again overriding filter_records, sort_records... #228

Closed panmari closed 6 years ago

panmari commented 7 years ago

Currently, when overriding for example filter_records in a custom datatable, it's ignored due to 'load_orm_extension' being called on initialize, which overrides the custom method by the one provided in the orm.

def initialize(view, options = {})
  @view    = view
  @options = options
  load_orm_extension
end

According to the rails generator datatable template, such use should be possible:

  # ==== These methods represent the basic operations to perform on records
  # and feel free to override them

  # def filter_records(records)
  # end

  # def sort_records(records)
  # end

  # def paginate_records(records)
  # end

As a workaround I'm currently overriding retrieve_records in my custom datatable

  def retrieve_records
    records = fetch_records
    records = filter_records_with_my_awesome_custom_logic(records)
    records = sort_records(records)     if datatable.orderable?
    records = paginate_records(records) if datatable.paginate?
    records
  end
natebird commented 7 years ago

I ran into the same issue. 👍

Thanks for the workaround.

aldefouw commented 7 years ago

Thanks for posting this. I just ran into the exact same issue.

maengkom commented 7 years ago

@panmari thanks, same issue and now solved.

maengkom commented 7 years ago

@panmari oh this make search column on associated model not working correctly, 2 records of associated model with different content always retrieves and displayed. If I am not override this way, it can search column and filter nested content correctly.

GUI commented 7 years ago

One thing to note about @panmari's workaround is that it doesn't affect the recordsFiltered count returned by the API, since the default records_filtered_count implementation is still calling the original filter_records method (rather than the custom one). While you could also override records_filtered_count in a similar fashion, here's a slightly different approach to this workaround that forces the replacement filter_records method to be re-defined after the ORM's version:

class ExampleDatatable < AjaxDatatablesRails::Base
  private

  def load_orm_extension
    super
    extend CustomOverrides
  end

  module CustomOverrides
    def filter_records(records)
      records = super(records)
      records.where(:other => "stuff")
    end
  end
end
n-rodriguez commented 6 years ago

An other way to fix this would be to make the gem a Rails engine. This way we could hook on Rails to extend the AjaxDatatablesRails::Base class in early loading stage and not on runtime.

n-rodriguez commented 6 years ago

But you loose the ability of having datatables plugged on Mongoid models.

n-rodriguez commented 6 years ago

But Mongoid models are not really supported. There is no implementation for this adapter. So what do we do? What do you suggest? What do you prefer?

n-rodriguez commented 6 years ago

But Mongoid models are not really supported. There is no implementation for this adapter. So what do we do? What do you suggest? What do you prefer?

See https://github.com/jbox-web/ajax-datatables-rails/issues/288#issuecomment-394536281 and https://github.com/jbox-web/ajax-datatables-rails/tree/feat/ar_class

n-rodriguez commented 6 years ago

Hi there! It's now fixed : https://github.com/jbox-web/ajax-datatables-rails/commit/719d6231e1612b995bd93cb773f4841d8e9fc7c0