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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ActiveRecord灯具如何动态插入全局命名空间?相关的知识,希望对你有一定的参考价值。

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

答案

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

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

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

以上是关于ActiveRecord灯具如何动态插入全局命名空间?的主要内容,如果未能解决你的问题,请参考以下文章

如何返回一个空的 ActiveRecord 关系?

如何编写迁移以重命名 Rails 中的 ActiveRecord 模型及其表?

具有动态类名的 PHP 命名空间

从函数内将变量插入全局命名空间? [复制]

如何避免在 MongoDB(使用 Mongoid)或 ActiveRecord(使用 MySQL 的 Rails)中插入两次相同的记录?

RailsAdmin:ActiveRecord :: RecordNotUnique,在创建用户#2972时插入id