bogdan / datagrid

Gem to create tables grids with sortable columns and filters
MIT License
1.02k stars 116 forks source link

get params in grid #222

Closed akam-it closed 7 years ago

akam-it commented 7 years ago

Hello!

How can I get params or variables from controller to grid? I tryed in controller @showall = params[:items_grid]['showall'] but in grid it become nil. In view it's ok.

Sorry, my rails not so good :( and English too :)

bogdan commented 7 years ago

You may write in Russian. It is ok.

Show me the controller source code and grid source code.

akam-it commented 7 years ago

Спасибо, у меня, по-умолчанию фильтр показывает записи за несколько дней. Но я хочу сделать фильтр, который показывал бы все записи. Я пробую сделать это как-то так:

items_controller.rb

    def index
        @showall = params[:items_grid]['showall']
        @items_grid = ItemsGrid.new(params[:items_grid]) do |scope|
            scope.page(params[:page])
        end
    end

items_grid.rb

  scope do
    if(@showall == 'ALL')
        Item
    else
        ids = Item.find_by_sql("SELECT * FROM items where actual_date <= CURDATE()+INTERVAL delivery_time day").map(&:id)
        Item.where(id: ids)
    end
  end
............
filter(:showall, :enum, :select => %w(5days ALL), include_blank: false, dummy: true)
............
bogdan commented 7 years ago

Я не понимаю почему ты делаешь это таким способом. scope не может быть использован так.... он задает базовый набор объектов, а фильтровать их можно только в фильтрах (что должно быть очевидно из названия). Зачем тебе find_by_sql в данном случае мне тоже не понятно.

Вот правильный способ это сделать:

scope { Item}

filter(:showall, :enum, :select => %w(5days ALL), include_blank: false, default: '5days') do |value, scope|
   if value == '5days'
    scope.where("actual_date <= CURDATE()+INTERVAL delivery_time day")
  end
end
akam-it commented 7 years ago

Спасибо! Сделал так как вы написали