ActiveRecord灯具如何动态插入全局命名空间?

问题描述 投票:3回答:1

ActiveRecord灯具的文档说:

除了在数据库中可用之外,还可以使用特殊的动态方法访问fixture的数据,该方法与模型具有相同的名称,并接受要实例化的fixture的名称:

并给出了这个例子。

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结果保留在文件中其他位置的范围内。

ruby-on-rails activerecord fixtures
1个回答
2
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.