gpt4 book ai didi

ruby-on-rails - ActiveRecord fixture 如何动态插入到全局命名空间中?

转载 作者:行者123 更新时间:2023-12-04 05:56:55 25 4
gpt4 key购买 nike

ActiveRecord fixtures 的文档说:

In addition to being available in the database, the fixture's data may also be accessed by using a special dynamic method, which has the same name as the model, and accepts the name of the fixture to instantiate:

并给出了这个例子。

test "find" do
assert_equal "Ruby on Rails", web_sites(:rubyonrails).name
end

Ruby on Rails 究竟是如何将“web_sites”插入命名空间的?我正在阅读 lib/active_record/fixtures.rb 中的文档和源代码,但我无法理解。

我问是因为(也许还有另一种方法可以做到这一点),我正在处理一个有很多固定装置并且速度很慢的应用程序,我想要一种在一个测试套件之前动态加载固定装置的方法,所以我们不会每次都加载它们。

现在我最好的解决方案是做这样的事情:

result = ActiveRecord::FixtureSet.create_fixtures("test/largefixtures", "web_sites")
rails_site = result[0].all_loaded_fixtures["web_sites"]["rubyonrails"].find

这看起来相当脆弱,更不用说我不确定如何将 create_fixtures 结果保留在文件其他位置的范围内。

最佳答案

如您所写,答案在 fixtures.rb 中使用 def setup_fixture_accessors(fixture_set_names = nil) 方法。

您可以看到创建了一个新模块。 fixture 访问器是使用模块中的 define_method 添加的。这样,accessor_name 就可以在模块中使用和调用。

最后,include methods,包含了上面定义的模块methods的所有方法。这些访问器现在可以在调用 def fixtures(*fixture_set_names)(通常是 ActiveSupport::TestCase)

的命名空间中使用

关于ruby-on-rails - ActiveRecord fixture 如何动态插入到全局命名空间中?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50236921/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com