【问题标题】:Want to develop a rubygem with ActiveRecord models想用 ActiveRecord 模型开发一个 ruby​​gem
【发布时间】:2018-07-27 17:02:25
【问题描述】:

我想开发一个用于安装在 rails 应用程序中的 ruby​​gem。

gem 将包含几个模型及其数据库迁移。

我还想添加测试来断言模型及其关系。我更喜欢 RSpec 这样做。

当我即将开始时,我遇到了一个问题,即如何在 gem 中使用 ActivRecord,以便使用测试我可以插入夹具数据并测试关系和行为。我相信 SQLite 应该被证明是最好的此处为数据库选项。

注意:我之前没有开发过任何 Rubygem,这将是我尝试的第一个。因此,我们将不胜感激任何帮助,以引导我朝着正确的方向前进。

谢谢。

2018 年 7 月 30 日更新

我发现了一个类似的问题Ruby Gem Development - How to use ActiveRecord?,这正是我想要做的。但答案并不十分清楚。希望这有助于理解我的问题。

【问题讨论】:

  • 问题是什么?
  • 想要开发一个 ruby​​gem,其中我将有一些基于 ActiveRecord 的模型,这些模型将被 Rails 应用程序直接使用。我还想使用 rspec 测试我的 gem 中的模型。我不知道该如何处理。

标签: ruby-on-rails activerecord rubygems ruby-on-rails-5


【解决方案1】:

您可以使用生成器获得您正在寻找的功能。基本上,您为用户应该拥有的文件(模型、迁移、测试)编写模板并将它们与您的 gemfile 一起保存。然后,您允许用户使用命令复制这些文件。

This is a good link 更详细地介绍了生成器,但这里是我在我的一个 gem 中使用的一个小例子:

gem_name/lib/generators/gem_name/install_generator.rb

module GemName
  class InstallGenerator < Rails::Generators::Base
    include Rails::Generators::Migration

    # Allow user to specify a different model name
    argument :user_class, type: :string, default: "User"

    # Templates to copy
    source_root File.expand_path('../../../templates', __FILE__)

    # Copy initializer into user app
    def copy_initializer
      copy_file('create_initializer.rb', 'config/initializers/gem_name.rb')
    end

    # Copy user information (model & Migrations) into user app
    def create_user_model
      fname = "app/models/#{user_class.underscore}.rb"
      unless File.exist?(File.join(destination_root, fname))
        template("user_model.rb", fname)
      else
        say_status('skipped', "Model #{user_class.underscore} already exists")
      end
    end

    # Copy migrations
    def copy_migrations
      if self.class.migration_exists?('db/migrate', "create_gem_name_#{user_class.underscore}")
        say_status('skipped', "Migration create_gem_name_#{user_class.underscore} already exists")
      else
        migration_template('create_gem_name_users.rb.erb', "db/migrate/create_gem_name_#{user_class.pluralize.underscore}.rb")
      end
    end

    private

    # Use to assign migration time otherwise generator will error
    def self.next_migration_number(dir)
      Time.now.utc.strftime("%Y%m%d%H%M%S")
    end
  end
end

最后,只是一些建议/个人意见;您的 gem 应该在各种测试套件和数据库下运行,或者您应该表明您只支持该设置并假设它们在用户的项目中可用。尽管我认为您可以在第二个测试套件中硬塞,但尝试强制使用第二个数据库是不可能的,而且您也不必担心使用迁移的数据库,除非您想使用不可用的数据类型在所有受支持的数据库中。

在我看来,更好的方法是为您想要的规范编写单独的生成器,并让用户有选择地运行它们。这将复制测试并允许他们根据需要进行修改。

【讨论】:

  • 谢谢。这绝对是有帮助的。但是,我想在我的 gem 本身中添加一些 ActiveRecord 继承的模型,然后想在我的 gem 代码本身中添加对这些模型、它们的关系、行为等的测试。我不希望 gem 安装程序复制这些模型,而是将其包含在他们的 Rails 应用程序的现有模型中,并开始使用我的 gem 将提供的行为。这个需求可以比作从我的 Rails 应用程序中提取一些工作模型,使它们更通用和可重用,并将它们打包到 gem 中。
  • 这和上面没有什么不同。您可以拥有所有这些东西,但您必须为用户提供迁移以将其集成到他们的项目中。这是我从中复制生成器的项目。您可以看到它既有 RSpec 测试,也有 AR 继承模型。 github.com/nicholasshirley/knock_once
  • 谢谢。您提供的参考资料看起来很相关。我将详细介绍并开始朝着我的目标努力。
猜你喜欢
  • 2014-02-21
  • 2012-06-01
  • 1970-01-01
  • 2021-08-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多