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]
覆盖默认范围的行为
是否有任何ActiveAdmin或Rails方法仅将默认范围应用于索引
我正在使用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