2017-10-13 60 views
1

我有索引和显示方法,像下面是有可能在多个动作中使用的变量值

def index 
    @variable = SomeModel.includes(:some_other_model) 
end 

def show 
    @variable = SomeModel.includes(:some_other_model).find_by!(id: params[:id]) 
end 

所以SomeModel.includes(:some_other_model)是在这两个行为普遍,我在做加盟的some_other_model索引和显示方法

两次

,所以我认为让这样做before_action将其移动到一个私有方法

before_action :set_something, only: [:index, :update] 

    def index 
     @variable 
    end 

    def show 
     @variable.find_by!(id: params[:id]) 
    end 

     private 

    def set_something 
    @variable = SomeModel.includes(:some_other_model) if @variable.nil? 
    rescue ArgumentError => e 
    render_error(:bad_request, e.message) 
    end 

所以我的问题是,有没有什么办法可以存储@var当索引或显示被调用时的可用值,以及下一次调用其他操作时是否使用相同的@变量值,而不是再次访问数据库?

回答

2

有什么办法,我可以存储@variable值时,无论是指数还是节目叫,当下次其他行动被称为只是使用相同的@variable值和不会再次命中数据库

不,没有办法。当另一个动作被调用时,它是你的控制器类的完全不同的实例。而上次这个实例变量,它早已消失。

这一边,你应该做塞巴斯蒂安建议。这是你开始的一个合乎逻辑的延续(所以至少,你不会在中以相同的动作击中DB两次)。


我们不能做到这一点使用类的实例变量吗?

使用类级别的数据,这是更容易实现的,但只有当你有一个web进程(以便所有的请求保证使用相同的类)。只要你添加另一个网络工作者,这停止工作。

这个问题让我再次看到你的代码,我意识到这一切都是毫无意义/误导。 :)

@variable = SomeModel.includes(:some_other_model) 

此行不打中数据库。所以尝试和记忆它是没有意义的。什么也省不了。这是什么命中数据库

@variable = SomeModel.includes(:some_other_model).find_by!(id: params[:id]) 
                ^^^^^^^^^^^^^^^^^^^^^^^^^ 
+0

谢谢。所以只是好奇,我们不能实现使用类实例变量呢? –

+0

@ Nick.S .:查看更新:) –

+0

不错。谢谢你的帮助。 –

相关问题