jbox-web/ajax-datatables-rails

Allow again overriding filter_records, sort_records...

panmari opened this issue ยท 10 comments

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

I ran into the same issue. ๐Ÿ‘

Thanks for the workaround.

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

@panmari thanks, same issue and now solved.

@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

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

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.

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

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?

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 #288 (comment) and https://github.com/jbox-web/ajax-datatables-rails/tree/feat/ar_class

Hi there! It's now fixed : 719d623