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
585 stars 228 forks source link

Custom conditions not works at 1.2.0 #376

Closed dostapn closed 3 years ago

dostapn commented 3 years ago
class UserDatatable < ApplicationDatatable
  def view_columns
    @view_columns ||= {
        id:          { source: "User.id" },
        region:      { source: "Region.name" },
        role:        { source: "User.role", cond: :filter_role_condition},
        last_name:   { source: "User.last_name" },
        first_name:  { source: "User.first_name" },
        middle_name: { source: "User.middle_name" },
        birthday:    { source: "User.birthday", searchable: false },
        email:       { source: "User.email" },
        nationality: { source: "User.nationality" },
        degree:      { source: "User.degree" },
        activity:    { source: "User.activity" },
    }
  end

  def data
    records.map do |record|
      {
          id:          record.id,
          region:      record.region_id ? record.region.try(:name) : I18n.t('no_value'),
          role:        record.role_text,
          last_name:   record.decorate.link_to_obj(object: record, attr: :last_name, class: 'text-primary'),
          first_name:  record.decorate.link_to_obj(object: record, attr: :first_name, class: 'text-primary'),
          middle_name: record.decorate.link_to_obj(object: record, attr: :middle_name, class: 'text-primary'),
          birthday:    record.decorate.birthday,
          email:       record.decorate.email,
          nationality: record.nationality,
          degree:      record.degree,
          activity:    record.activity,
          links:       record.decorate.dt_actions
      }
    end
  end

  def get_raw_records
    User.eager_load(:region)
  end

  def filter_role_condition
    ->(column, value) do
      ::Arel::Nodes::SqlLiteral.new(column.field.to_s).eq(column.search.value)
    end
  end
end
Started GET "/surveys/users.json?draw=36&columns%5B0%5D%5Bdata%5D=region&columns%5B0%5D%5Bname%5D=&columns%5B0%5D%5Bsearchable%5D=true&columns%5B0%5D%5Borderable%5D=true&columns%5B0%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B0%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B1%5D%5Bdata%5D=role&columns%5B1%5D%5Bname%5D=&columns%5B1%5D%5Bsearchable%5D=true&columns%5B1%5D%5Borderable%5D=true&columns%5B1%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B1%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B2%5D%5Bdata%5D=last_name&columns%5B2%5D%5Bname%5D=&columns%5B2%5D%5Bsearchable%5D=true&columns%5B2%5D%5Borderable%5D=true&columns%5B2%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B2%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B3%5D%5Bdata%5D=first_name&columns%5B3%5D%5Bname%5D=&columns%5B3%5D%5Bsearchable%5D=true&columns%5B3%5D%5Borderable%5D=true&columns%5B3%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B3%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B4%5D%5Bdata%5D=middle_name&columns%5B4%5D%5Bname%5D=&columns%5B4%5D%5Bsearchable%5D=true&columns%5B4%5D%5Borderable%5D=true&columns%5B4%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B4%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B5%5D%5Bdata%5D=birthday&columns%5B5%5D%5Bname%5D=&columns%5B5%5D%5Bsearchable%5D=true&columns%5B5%5D%5Borderable%5D=true&columns%5B5%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B5%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B6%5D%5Bdata%5D=email&columns%5B6%5D%5Bname%5D=&columns%5B6%5D%5Bsearchable%5D=true&columns%5B6%5D%5Borderable%5D=true&columns%5B6%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B6%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B7%5D%5Bdata%5D=nationality&columns%5B7%5D%5Bname%5D=&columns%5B7%5D%5Bsearchable%5D=true&columns%5B7%5D%5Borderable%5D=true&columns%5B7%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B7%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B8%5D%5Bdata%5D=degree&columns%5B8%5D%5Bname%5D=&columns%5B8%5D%5Bsearchable%5D=true&columns%5B8%5D%5Borderable%5D=true&columns%5B8%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B8%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B9%5D%5Bdata%5D=activity&columns%5B9%5D%5Bname%5D=&columns%5B9%5D%5Bsearchable%5D=true&columns%5B9%5D%5Borderable%5D=true&columns%5B9%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B9%5D%5Bsearch%5D%5Bregex%5D=false&columns%5B10%5D%5Bdata%5D=links&columns%5B10%5D%5Bname%5D=&columns%5B10%5D%5Bsearchable%5D=false&columns%5B10%5D%5Borderable%5D=false&columns%5B10%5D%5Bsearch%5D%5Bvalue%5D=&columns%5B10%5D%5Bsearch%5D%5Bregex%5D=false&order%5B0%5D%5Bcolumn%5D=0&order%5B0%5D%5Bdir%5D=asc&start=0&length=10&search%5Bvalue%5D=%D0%B0%D0%B4%D0%BC%D0%B8qqqqqqqqq&search%5Bregex%5D=false&_=1608106702241" for 127.0.0.1 at 2020-12-16 11:43:53 +0300
Processing by UsersController#index as JSON
  Parameters: {"draw"=>"36", "columns"=>{"0"=>{"data"=>"region", "name"=>"", "searchable"=>"true", "orderable"=>"true", "search"=>{"value"=>"", "regex"=>"false"}}, "1"=>{"data"=>"role", "name"=>"", "searchable"=>"true", "orderable"=>"true", "search"=>{"value"=>"", "regex"=>"false"}}, "2"=>{"data"=>"last_name", "name"=>"", "searchable"=>"true", "orderable"=>"true", "search"=>{"value"=>"", "regex"=>"false"}}, "3"=>{"data"=>"first_name", "name"=>"", "searchable"=>"true", "orderable"=>"true", "search"=>{"value"=>"", "regex"=>"false"}}, "4"=>{"data"=>"middle_name", "name"=>"", "searchable"=>"true", "orderable"=>"true", "search"=>{"value"=>"", "regex"=>"false"}}, "5"=>{"data"=>"birthday", "name"=>"", "searchable"=>"true", "orderable"=>"true", "search"=>{"value"=>"", "regex"=>"false"}}, "6"=>{"data"=>"email", "name"=>"", "searchable"=>"true", "orderable"=>"true", "search"=>{"value"=>"", "regex"=>"false"}}, "7"=>{"data"=>"nationality", "name"=>"", "searchable"=>"true", "orderable"=>"true", "search"=>{"value"=>"", "regex"=>"false"}}, "8"=>{"data"=>"degree", "name"=>"", "searchable"=>"true", "orderable"=>"true", "search"=>{"value"=>"", "regex"=>"false"}}, "9"=>{"data"=>"activity", "name"=>"", "searchable"=>"true", "orderable"=>"true", "search"=>{"value"=>"", "regex"=>"false"}}, "10"=>{"data"=>"links", "name"=>"", "searchable"=>"false", "orderable"=>"false", "search"=>{"value"=>"", "regex"=>"false"}}}, "order"=>{"0"=>{"column"=>"0", "dir"=>"asc"}}, "start"=>"0", "length"=>"10", "search"=>{"value"=>"адмиqqqqqqqqq", "regex"=>"false"}, "_"=>"1608106702241"}
  User Load (0.6ms)  SELECT  "users".* FROM "users" WHERE "users"."id" = $1 ORDER BY "users"."id" ASC LIMIT $2  [["id", 1], ["LIMIT", 1]]
  ↳ app/controllers/application_controller.rb:26
   (2.3ms)  SELECT COUNT(DISTINCT "users"."id") FROM "users" LEFT OUTER JOIN "regions" ON "regions"."id" = "users"."region_id"
  ↳ /home/dostapn/.rvm/gems/ruby-2.5.8/bundler/gems/ajax-datatables-rails-41cc661e8acb/lib/ajax-datatables-rails/base.rb:86
Completed 500 Internal Server Error in 77ms (ActiveRecord: 13.1ms)

Arel::Visitors::UnsupportedVisitError - Unsupported argument type: NilClass. Construct an Arel node instead.:
  app/controllers/users_controller.rb:9:in `block (2 levels) in index'
  app/controllers/users_controller.rb:7:in `index'
# frozen_string_literal: true

class UsersController < ApplicationController
  before_action :set_user, only: %i[show edit update destroy manual_reset_password]

  def index
    respond_to do |format|
      format.html
      format.json { render json: UserDatatable.new(params) }
    end
  end
...

i cant find any syntax rules for writing custom conditions, only for 0.4.0 but any of these is not working

n-rodriguez commented 3 years ago
        role:        { source: "User.role", cond: :filter_role_condition},

It should be :

        role:        { source: "User.role", cond: filter_role_condition},
n-rodriguez commented 3 years ago

This will call the method filter_role_condition which returns a lambda ->(column, value) do which will be executed later to filter records.

n-rodriguez commented 3 years ago

btw you should update to v1.3.0. It raises an error on invalid cond: param like this one.