Ruby on rails 添加默认范围

Ruby on rails 添加默认范围,ruby-on-rails,activeadmin,Ruby On Rails,Activeadmin,我希望默认范围仅应用于模型中的操作 我在模型中添加了default\u scope: default_scope { where(:status => "Active") } 我可以在其他操作中使用unscope(即显示,编辑,更新和删除)如下: 而不是: @beacon = Beacon.find(params[:id] 覆盖默认范围的行为 是否有任何ActiveAdmin或Rails方法仅将默认范围应用于索引 我正在使用ActiveAdmin 我可能会在将来添加更多操作,只需要对其

我希望默认范围仅应用于模型中的操作

我在模型中添加了
default\u scope

default_scope { where(:status => "Active") }
我可以在其他操作中使用
unscope
(即
显示
编辑
更新
删除
)如下:

而不是:

@beacon = Beacon.find(params[:id]
覆盖默认范围的行为

是否有任何ActiveAdminRails方法仅将默认范围应用于
索引

我正在使用ActiveAdmin


我可能会在将来添加更多操作,只需要对其应用默认范围,因此我正在寻找一个较短且紧凑的解决方案

您可以为此使用名为
@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

似乎是一个可行的解决方案-如何符合您的要求

好的,我希望能有一个简单的助手,我可以使用它将默认范围仅应用于某些操作。但是,相反,我最终在动作之前添加了一个
,它将只获取特定动作的
非范围的
记录

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

这样,我可以在“操作前”列表中添加更多这样的操作,对于剩余的操作(需要默认范围时),
default\u范围将得到处理

为什么不在索引操作中应用此作用域?@Ilya我将来可能会添加更多操作,我只需要将默认作用域应用于这些操作,因此我正在寻找一个较短的解决方案。我能想到的最简洁的方法是在控制器中有一个单独的“收集”方法,使用before操作,该操作将要应用于给定操作的该集合的范围。鉴于模型不知道它处于哪个控制器操作中,我看不到直接从模型文件执行该操作的方法。@马克,谢谢你的评论。我最终考虑了你的方法,最终结果是一个简洁明了的解决方案:)别担心——我本来打算写一些类似的东西,但我的老板今天和我在办公室,所以我不得不等到午餐:)
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