我有索引和显示方法,如下所示
#0. Crashed: com.apple.main-thread
0 libsystem_kernel.dylib 0x190c9fd74 __abort_with_payload + 8
1 libsystem_kernel.dylib 0x190c9c4d0 abort_with_payload_wrapper_internal + 100
2 libsystem_kernel.dylib 0x190c9c46c abort_with_payload_wrapper_internal + 34
3 libobjc.A.dylib 0x190707ea4 _objc_fatalv(unsigned long long, unsigned long long, char const*, char*) + 112
4 libobjc.A.dylib 0x190707dfc __objc_error + 42
5 libobjc.A.dylib 0x19071bedc weak_entry_insert(weak_table_t*, weak_entry_t*) + 318
6 libobjc.A.dylib 0x190724768 objc_initWeak + 320
7 UIKit 0x197e54bf0 -[UIViewController viewDidMoveToWindow:shouldAppearOrDisappear:] + 2100
8 UIKit 0x197dd51f8 -[UIView(Internal) _didMoveFromWindow:toWindow:] + 1096
9 UIKit 0x197dd506c -[UIView(Internal) _didMoveFromWindow:toWindow:] + 700
10 UIKit 0x197dd4538 __45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke + 156
11 Foundation 0x1926e1abc -[NSISEngine withBehaviors:performModifications:] + 168
12 UIKit 0x197dd43b0 -[UIView(Hierarchy) _postMovedFromSuperview:] + 816
13 UIKit 0x1980cded0 __UIViewWasRemovedFromSuperview + 172
14 UIKit 0x197dd3434 -[UIView(Hierarchy) removeFromSuperview] + 512
15 UIKit 0x1987c303c __46-[UIInputWindowController invalidateInputView]_block_invoke + 128
16 UIKit 0x19817b598 -[UIResponder _preserveResponderOverridesWhilePerforming:] + 140
17 UIKit 0x1987c2fac -[UIInputWindowController invalidateInputView] + 104
18 UIKit 0x1987c3960 -[UIInputWindowController changeToInputViewSet:] + 252
19 UIKit 0x1987c4fc8 __43-[UIInputWindowController setInputViewSet:]_block_invoke_2.1355 + 36
20 UIKit 0x1987bdbac -[UIInputWindowController moveFromPlacement:toPlacement:starting:completion:] + 436
21 UIKit 0x1987c4f98 __43-[UIInputWindowController setInputViewSet:]_block_invoke.1354 + 100
22 UIKit 0x1987b9c98 -[UIInputWindowController performOperations:withTemplateNotificationInfo:] + 56
23 UIKit 0x1987c4aec -[UIInputWindowController setInputViewSet:] + 1604
24 UIKit 0x1987bd61c -[UIInputWindowController performOperations:withAnimationStyle:] + 56
25 UIKit 0x197e9d9a0 -[UIPeripheralHost(UIKitInternal) setInputViews:animationStyle:] + 1376
26 UIKit 0x197dfe988 -[UIResponder(UIResponderInputViewAdditions) reloadInputViews] + 80
27 (App calls [textView reloadInputViews])
所以def index
@variable = SomeModel.includes(:some_other_model)
end
def show
@variable = SomeModel.includes(:some_other_model).find_by!(id: params[:id])
end
在两个动作中都很常见,我在index和show方法中连接some_other_model两次
所以我想让我们把before_action移动到私有方法
SomeModel.includes(:some_other_model)
所以我的问题是,有什么方法可以在调用index或show时存储@variable值,并且在下次调用其他操作时,只使用相同的@variable值而不是再次命中数据库?
答案 0 :(得分:2)
有什么方法可以在调用索引或show时存储
@variable
值,并且在下次调用其他操作时使用相同的@variable
值并且再次不命中数据库强>
不,没有办法。调用其他操作时,它是控制器类的完全不同的实例。而且这个实例变量从上次开始,它早已不复存在。
除此之外,你应该做塞巴斯蒂安建议的事情。这是你开始时的逻辑延续(因此,至少,你不会在相同的动作中两次击中数据库)。我们也无法使用类实例变量来实现这一目标吗?
使用类级数据,这是更容易实现的,但前提是您只有一个Web进程(以确保所有请求都使用相同的类)。只要添加另一个Web工作程序,就会停止工作。
这个问题让我再次看看你的代码,我意识到这一切都是毫无意义/错误的。 :)
@variable = SomeModel.includes(:some_other_model)
此行未命中数据库。因此尝试记忆它没有意义。什么都不保存这就是命中数据库的原因
@variable = SomeModel.includes(:some_other_model).find_by!(id: params[:id])
^^^^^^^^^^^^^^^^^^^^^^^^^