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

时间:2018-05-08 15:13:08

标签: ruby-on-rails activerecord fixtures

ActiveRecord灯具的文档说:

  

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

并给出了这个例子。

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

1 个答案:

答案 0 :(得分:2)

正如您所写,答案是使用def setup_fixture_accessors(fixture_set_names = nil)方法的fixtures.rb

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

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