【发布时间】:2019-07-17 20:00:01
【问题描述】:
我有一个设置条目的表。我想在我的模型和控制器中将这些条目作为变量访问,而无需每次都查询数据库来设置这些变量。
我可以通过为我的模型和控制器创建重复的“关注点”来使其工作。我还可以在我的 ApplicationController 中设置全局变量。或者我可以在我需要它们的每个地方初始化它们。设置和访问可以在控制器和模型中访问的全局变量的正确 rails 方法是什么?
class ItemType
has_many :items
end
class Item
belongs_to :item_type
belongs_to :foo
end
class Foo
has_many :items
def build_item
bar_item_type = ItemType.find_by(:name => "bar")
self.items.build(
:foo_id => self.id,
:item_type_id => bar_item_type.id
)
end
end
class ItemsController
def update
bar_item_type = ItemType.find_by(:name => "bar")
@item.update(:item_type_id => bar_item_type.id)
end
end
在示例中,您可以看到我在 Foo 模型和 ItemsController 中都声明了 bar_item_type 变量。我希望能够为我的 rails 项目创建和访问该变量一次,而不必在任何地方进行相同的数据库调用,从而干掉我的代码库。
【问题讨论】:
-
我不确定您的示例是否清楚说明您为什么要这样做。你真的会在你的应用程序中使用
ItemType.find_by(:name => "bar")吗?在您的用例中使用全局变量会破坏 MVC 和基本的 Rails 约定。你首先需要问自己为什么你认为你需要这样做。可能有更好更传统的方法来做到这一点。 -
我想这是我的问题。使用上面的示例执行此操作的常规/更好方法是什么?我想要一个在这两个用例中都可以访问的变量。
-
问题是,你怎么能确定
ItemType.find_by(:name => "bar")甚至会返回任何东西?您的代码对数据库做出假设。 -
数据库以特定的 item_types 为种子。数据库假定并设计为具有它们。
标签: ruby variables ruby-on-rails-4 global-variables activesupport-concern