Добавление области по умолчанию - PullRequest
0 голосов
/ 25 октября 2018

Я хочу, чтобы область действия по умолчанию была применена только к index действию в модели.

Я добавляю default_scope к модели как таковой:

default_scope { where(:status => "Active") }

и я могу использовать unscope в других действиях (например, show, edit, update и delete), например:

@beacon = Beacon.where(id: params[:id]).unscope(where: :status).first

вместо:

@beacon = Beacon.find(params[:id]

для переопределения поведения области по умолчанию.

Существует ли метод ActiveAdmin или Rails для применения области по умолчанию только до index?

Я использую ActiveAdmin.

В будущем я могу добавить больше действий, только к которым мне нужно применитьобъем по умолчанию, поэтому я ищу более короткое и компактное решение .

Ответы [ 2 ]

0 голосов
/ 25 октября 2018

ОК, я надеялся, что может быть простой помощник , который я мог бы использовать, чтобы применить область по умолчанию только к определенным действиям .Но вместо этого я добавил before_action, который будет извлекать записи unscoped только для определенных действий.

before_action :set_unscoped_beacon_variables, only: [:show, :edit, :update, :destroy]

def set_unscoped_beacon_variables
  @beacons = Beacon.unscope(where: :status)
  @beacon = Beacon.where(id: params[:id]).unscope(where: :status).first
end

Таким образом, я могу добавить больше таких действий в список before_action и дляОстальные действия (если требуется область по умолчанию), default_scope позаботится!

0 голосов
/ 25 октября 2018

Не могли бы вы использовать коллекцию под названием @scoped или аналогичную для этого?

Например:

ACTIONS_WITH_DEFAULT_SCOPE = ['index']

before_action :set_scoped_collection

...

def set_scoped_collection
  @scoped = if action_name.in?(ACTIONS_WITH_DEFAULT_SCOPE)
    Beacon.where(status: "Active")
  else
    Beacon.all
  end
end

# or the otherway round, using `unscope`
def set_scoped_collection
  @scoped = if action_name.in?(ACTIONS_WITH_DEFAULT_SCOPE)
    Beacon.all
  else
    Beacon.unscope(where: :status)
  end
end

Кажется работоспособным решение - как это соответствует вашим требованиям?

...